一、工厂模式
属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
二、代码示例
场景:花店有不同的花,通过工厂模式来获取花。
1、普通工厂模式
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建规范的工厂类,封装创建实体对象的方法,只需要根据提供的基础信息就能区别出需要返回的实体对象。
(3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。
逻辑关系:
代码示例:
// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
// 描述花的信息
String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
@Override
public String desc() {
return "玫瑰花";
}
}
// 实现类2,牡丹花
public class Peony implements Flower {
@Override
public String desc() {
return "牡丹花";
}
}
// 定义花的创建工厂类
public class FlowerFactory {
// 根据花的名称返回创建对象
public Flower createFlower(String message){
if ("玫瑰".equals(message)){
return new Rose();
} else {
return new Peony();
}
}
}
// 测试类
public class ZTest {
public static void main(String[] args) {
FlowerFactory flowerFactory = new FlowerFactory();
Flower flower = flowerFactory.createFlower("玫瑰");
System.out.println(flower.desc());
flower = flowerFactory.createFlower("牡丹");
System.out.println(flower.desc());
}
}
运行结果:
由运行结果看到,只要对工厂类提供基础的信息描述文字,就能得到对应的花的实体对象。
总结:
仅定义一个工厂用于创建所有可能的实例,根据描述信息创建对应的实例(相当于知道的花的名称,然后去找花店得到花)。
2、抽象工厂示例
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建抽象的规范工厂(抽象类),定义统一的创建方法(抽象方法)
(3)、创建每一种实体的工厂类,实现规范工厂的抽象方法用来创建对应的实例对象
(4)、定义抽象工厂,不同场景下构建不同的实例工厂来创建对象
逻辑关系:
代码示例:
// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
// 描述花的信息
String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
@Override
public String desc() {
return "玫瑰花";
}
}
// 实现类2,牡丹花
public class Peony implements Flower {
@Override
public String desc() {
return "牡丹花";
}
}
// 定义抽象工厂和抽象创建方法
public abstract class FlowerFactory {
abstract Flower createFlower();
}
// 定义玫瑰的实例工厂,实现抽象工厂
public class RoseFactory extends FlowerFactory {
public Flower createFlower(){
return new Rose();
};
}
// 定义牡丹的实例工厂,实现抽象工厂
public class PeonyFactory extends FlowerFactory {
public Flower createFlower(){
return new Peony();
};
}
// 测试方法
public class ZTest {
public static void main(String[] args) {
FlowerFactory flowerFactory = new RoseFactory();
Flower flower = flowerFactory.createFlower();
System.out.println(flower.desc());
flowerFactory = new PeonyFactory();
flower = flowerFactory.createFlower();
System.out.println(flower.desc());
}
}
运行结果
总结:
需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。
三、普通工厂和抽象工厂对比
两种方法都实现了封装创建实例的功能。
但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。
抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。
总结来说,工厂模式和抽象工厂模式都有其独特的优点和适用场景。工厂模式适用于创建单个对象的情况,而抽象工厂模式适用于创建一系列相关的产品对象。在选择使用哪种模式时,应根据具体的业务需求和系统架构进行权衡和选择。
学海无涯苦作舟!!!