在我们平常创建对象的时候,都是通过关键字 new 来实现的,例:Class A = new A() 。
在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。
工厂模式包括:简单工厂(不在23种设计模式中)、工厂方法和抽象工厂。
简单工厂
简单工厂一开始真的很简单
public class MaskFactory { public Mask createMask() { Mask mask = new Mask(); // ..... // 100行初始化代码 return mask; } }
口罩工厂类只需要new一个口罩对象,配置好,返回即可
但假如我们需要口罩类的子类,就会比较判断,变成了要加if-else了
假设口罩类是个接口,有两个子类“高端口罩”和“低端口罩”分别实现了这个接口:
public interface IMask { void show(); } public class HighEndMask implements IMask { @Override public void show() { System.out.println("我是高端口罩"); } } public class LowEndMask implements IMask { @Override public void show(){ System.out.println("我的低端口罩"); } }
在工厂中(还是口罩工厂),通过加if-else判断来生产对象
public class MaskFactory{ public IMask createMask(String type) { IMask mask = null; if("高端口罩".equals(type)){ mask = new HighEndMask(); // ..... // HighEndMask的100行初始化代码 }else if("低端口罩".equals(type)){ mask = new LowEndMask(); // ..... // LowEndMask的100行初始化代码 } return mask; } }
客户端传递字符串参数,枚举什么的,都行
public class Test { public static void main(String[] args) { MaskFactory factory = new MaskFactory(); IMask maskA = factory.createMask("高端口罩"); IMask maskB = factory.createMask("低端口罩"); maskA.show(); maskB.show(); } }
不过这违反了开闭原则,对“扩展”开放,对“修改”封闭
工厂方法模式
每一个口罩子类都对应一个工厂的子类
public interface IMaskFactory { IMask createMask(); } public class HighEndFactory implements IMaskFactory{ @Override public IMask createMask() { IMask mask = new HighEndMask(); // ..... // HighEndMask的100行初始化代码 return mask; } } public class LowEndFactory implements IMaskFactory{ @Override public IMask createMask() { IMask mask = new LowEndMask(); // ..... // LowEndMask的100行初始化代码 return mask; } }
客户端调不同的工厂即可
public class Test { public static void main(String[] args) { IMaskFactory factoryA = new LowEndFactory(); IMaskFactory factoryB = new HighEndFactory(); IMask maskA = factoryA.createMask(); IMask maskB = factoryB.createMask(); maskA.show(); maskB.show(); } }
这一看就感觉一眼难尽。。。
抽象工厂
https://zhuanlan.zhihu.com/p/243277598
本来以为有什么不同的,结果只是进行了以下组合。。。
高端工厂类中有两个方法,制造高端口罩,制造高端防护服
其实很好理解。。。
所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。
工厂模式的应用
例如spring中的bean