一. 前言:
小熙搜集了些工厂模式的资料,工厂模式在23种设计模式之中也是属于创建类型,适用于灵活的管控对象和方法的创建过程。
二. 过程:
-
抽象工厂图解:
-
抽象工厂模式(先写一个复杂的吧)
(1)抽象工厂
/** * 抽象工厂 * * @author chengxi * @date 2020/8/24 17:01 */ public abstract class AbastractFactory { /** * 创建食物 * @return */ abstract Food createFood(); /** * 创建水 * @return */ abstract Water createWater(); }
(2) 事务抽象类
/** * @author chengxi * @date 2020/8/24 17:04 */ public abstract class Food { /** * 打印保质期 * @return */ abstract void printShelfLife(); }
(3)水的抽象类
/** * @author chengxi * @date 2020/8/24 17:06 */ public abstract class Water { /** * 打印类别 * @return */ abstract void printType(); }
(4)食物的实现类
/** * @author chengxi * @date 2020/8/24 17:07 */ public class Bread extends Food { @Override void printShelfLife() { System.out.println("面包的保质期是一个月"); } } /** * @author chengxi * @date 2020/8/24 17:08 */ public class Rice extends Food { @Override void printShelfLife() { System.out.println("大米的保质期是一年"); } }
(5)水的实现类
/** * @author chengxi * @date 2020/8/24 17:09 */ public class Pulsation extends Water { @Override void printType() { System.out.println("这瓶水的类别是饮料:脉动"); } } /** * @author chengxi * @date 2020/8/24 17:10 */ public class NongfuSpring extends Water { @Override void printType() { System.out.println("这瓶水的类别是矿泉水:农夫山泉"); } }
(6)传统工厂实现
/** * 传统工厂 * * @author chengxi * @date 2020/8/24 17:13 */ public class TraditionalFactory extends AbastractFactory { @Override Food createFood() { return new Rice(); } @Override Water createWater() { return new NongfuSpring(); } }
(7)现代工厂具体实现
/** * 现代工厂 * * @author chengxi * @date 2020/8/24 17:14 */ public class ModernFactory extends AbastractFactory { @Override Food createFood() { return new Bread(); } @Override Water createWater() { return new Pulsation(); } }
(8)测试结果类
/** * 工厂模式,极大的使用了java的多态和继承的使用 * * @author chengxi * @date 2020/8/24 17:15 */ public class TestMethod { public static void main(String[] args) { AbastractFactory modernFactory = new ModernFactory(); AbastractFactory traditionalFactory = new TraditionalFactory(); modernFactory.createFood().printShelfLife(); modernFactory.createWater().printType(); traditionalFactory.createFood().printShelfLife(); traditionalFactory.createWater().printType(); } }
结果如图:
-
工厂方法模式
(1) 图解:
-
解释:
相较于抽象工厂模式,工厂方法模式更注重单一系列的维度的生产,更像是纵向的拓展。而抽象工厂模式可以有多个系列的维度的生产,更像是横向的拓展。
-
区别:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。特点:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 “一种” 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。
-
三.后语:
当需要批量生产bean的时候,小熙建议可以考虑是对特定一种产品的生产还是产品一族的生产去抉择。在spring中的IOC有更完美的解耦(读取配置文件),可以借鉴参考。