1. 工厂(Factory)模式
工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂
2. 简单工厂(Simple Factory )
只定义一个具体工厂,由该工厂判断生产哪个产品。
缺点:违背开闭,扩展不易

三个角色
Factory:工厂角色, WuLinFactory
/*** 简单工厂* 1.产品数量极少*/public class WuLinFactory {//简单工厂一切从简public AbstractCar newCar(String type) {if ("van".equals(type)) {return new VanCar();} else if ("mini".equals(type)) {return new MinCar();}return null;}}
Product:抽象产品角色,Car
/*** 工厂产品*/public abstract class AbstractCar {String engine;public abstract void run();}
ConcreteProduct:具体产品角色, VanCar、MiniCar
public class MinCar extends AbstractCar {public MinCar() {this.engine = "四缸发动机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
public class VanCar extends AbstractCar {public VanCar() {this.engine = "单杠柴油机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
测试方法:
public static void main(String[] args) {WuLinFactory factory = new WuLinFactory();AbstractCar van = factory.newCar("van");AbstractCar mini = factory.newCar("mini");AbstractCar qwq = factory.newCar("qwq");van.run();System.out.println(van);mini.run();System.out.println(mini);System.out.println(qwq);}
3. 工厂方法(Factory Method)
将工厂抽象化,定义多个生产工厂,每个工厂只负责自己生产的产品。
缺点:系统复杂度增加,产品单一

四个角色
Product:抽象产品
/*** 工厂产品** 怎么把一个功能提升一个层次:定义抽象(抽象类、接口)* 抽象类,接口 就会有多实现 多实现自然有多功能*/public abstract class AbstractCar {String engine;public abstract void run();}
ConcreteProduct:具体产品
三个具体产品
/*** 继承工厂抽象产品 为一个具体的产品*/public class VanCar extends AbstractCar {public VanCar() {this.engine = "单杠柴油机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
public class MiniCar extends AbstractCar {public MiniCar() {this.engine = "四缸发动机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
public class RacingCar extends AbstractCar {public RacingCar() {this.engine = "V8发动机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
Factory:抽象工厂
将生产方法抽象化
public abstract class AbstractCarFactory {public abstract AbstractCar newCar();}
ConcreteFactory:具体工厂
有多少个产品就有多少个工厂
public class WulinMiniCarFactory extends AbstractCarFactory{@Overridepublic AbstractCar newCar() {}}
public class WulinRacingCarFactory extends AbstractCarFactory{@Overridepublic AbstractCar newCar() {return new RacingCar();}}
public class WulinVanCarFactory extends AbstractCarFactory{@Overridepublic AbstractCar newCar() {return new VanCar();}}
测试类
public static void main(String[] args) {AbstractCarFactory carFactory = new WulinRacingCarFactory();AbstractCar abstractCar = carFactory.newCar();abstractCar.run();carFactory = new WulinMiniCarFactory();AbstractCar abstractCar1 = carFactory.newCar();abstractCar1.run();carFactory = new WulinVanCarFactory();AbstractCar abstractCar2 = carFactory.newCar();abstractCar2.run();}
4. 抽象工厂(Abstract Factory)


将工厂抽象化 抽象方法为生产抽象类别,需要什么产品就创建什么工厂来生成。
抽象产品族:即抽象类别
public abstract class AbstractCar {String engine;public abstract void run();}
public abstract class AbstractMask {Integer price;public abstract void protecteMe();}
产品等级结构:生具体产品族的具体产品
public class MiniCar extends AbstractCar {public MiniCar() {this.engine = "四缸发动机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
public class VanCar extends AbstractCar {public VanCar() {this.engine = "单杠柴油机";}@Overridepublic void run() {System.out.println(engine + "被生产");}}
public class N95Mask extends AbstractMask {public N95Mask() {this.price = 2;}@Overridepublic void protecteMe() {System.out.println("N95口罩被生产 价位为" + price);}}
public class CommonMask extends AbstractMask {public CommonMask() {this.price = 1;}@Overridepublic void protecteMe() {System.out.println("普通口罩被生成 价格为" + price);}}
总厂规范:工厂全部产品族
可以再次细分工厂产品族,不生成的类别返回null,生成的类别为抽象(abstract)方法,让生成工厂实现单一类别的生成产品。
/*** 总厂规范*/public abstract class WulinFactory {abstract AbstractCar newCar();abstract AbstractMask newMask();}
生成工厂:生成指定产品族的指定产品
public class WulinMiniCarFatory extends WulinFactory {@Overrideprotected AbstractCar newCar() {return new MiniCar();}@OverrideAbstractMask newMask() {return null;}}
public class WulinVanCarFatory extends WulinFactory {@Overrideprotected AbstractCar newCar() {return new VanCar();}@OverrideAbstractMask newMask() {return null;}}
public class WulinN95MaskFactory extends WulinFactory{@Overrideprotected AbstractCar newCar() {return null;}@OverrideAbstractMask newMask() {return new N95Mask();}}
public class WulinCommonMaskFactory extends WulinFactory{@Overrideprotected AbstractCar newCar() {return null;}@OverrideAbstractMask newMask() {return new CommonMask();}}
测试方法:
public static void main(String[] args) {WulinFactory wulinFactory = new WulinCommonMaskFactory();AbstractMask commonMask = wulinFactory.newMask();commonMask.protecteMe(); //只生成普通口罩wulinFactory = new WulinN95MaskFactory();AbstractMask N95 = wulinFactory.newMask();N95.protecteMe(); //生成N95wulinFactory = new WulinMiniCarFatory();AbstractCar miniCar = wulinFactory.newCar();miniCar.run();wulinFactory = new WulinVanCarFatory();AbstractCar vanCar = wulinFactory.newCar();vanCar.run();}
5. 工厂模式的退化
- 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
6. 应用场景
- NumberFormat、SimpleDateFormat
- LoggerFactory:
- SqlSessionFactory:MyBatis
- BeanFactory:Spring的BeanFactory(就是为了造出bean)
