1. 工厂(Factory)模式

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂

2. 简单工厂(Simple Factory )

只定义一个具体工厂,由该工厂判断生产哪个产品。

缺点:违背开闭,扩展不易

05. 工厂(Factory)模式 - 图1

三个角色

Factory:工厂角色, WuLinFactory

  1. /**
  2. * 简单工厂
  3. * 1.产品数量极少
  4. */
  5. public class WuLinFactory {
  6. //简单工厂一切从简
  7. public AbstractCar newCar(String type) {
  8. if ("van".equals(type)) {
  9. return new VanCar();
  10. } else if ("mini".equals(type)) {
  11. return new MinCar();
  12. }
  13. return null;
  14. }
  15. }

Product:抽象产品角色,Car

  1. /**
  2. * 工厂产品
  3. */
  4. public abstract class AbstractCar {
  5. String engine;
  6. public abstract void run();
  7. }

ConcreteProduct:具体产品角色, VanCar、MiniCar

  1. public class MinCar extends AbstractCar {
  2. public MinCar() {
  3. this.engine = "四缸发动机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }
  1. public class VanCar extends AbstractCar {
  2. public VanCar() {
  3. this.engine = "单杠柴油机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }

测试方法:

  1. public static void main(String[] args) {
  2. WuLinFactory factory = new WuLinFactory();
  3. AbstractCar van = factory.newCar("van");
  4. AbstractCar mini = factory.newCar("mini");
  5. AbstractCar qwq = factory.newCar("qwq");
  6. van.run();
  7. System.out.println(van);
  8. mini.run();
  9. System.out.println(mini);
  10. System.out.println(qwq);
  11. }

3. 工厂方法(Factory Method)

将工厂抽象化,定义多个生产工厂,每个工厂只负责自己生产的产品。

缺点:系统复杂度增加,产品单一

05. 工厂(Factory)模式 - 图2

四个角色

Product:抽象产品

  1. /**
  2. * 工厂产品
  3. *
  4. * 怎么把一个功能提升一个层次:定义抽象(抽象类、接口)
  5. * 抽象类,接口 就会有多实现 多实现自然有多功能
  6. */
  7. public abstract class AbstractCar {
  8. String engine;
  9. public abstract void run();
  10. }

ConcreteProduct:具体产品

三个具体产品

  1. /**
  2. * 继承工厂抽象产品 为一个具体的产品
  3. */
  4. public class VanCar extends AbstractCar {
  5. public VanCar() {
  6. this.engine = "单杠柴油机";
  7. }
  8. @Override
  9. public void run() {
  10. System.out.println(engine + "被生产");
  11. }
  12. }
  1. public class MiniCar extends AbstractCar {
  2. public MiniCar() {
  3. this.engine = "四缸发动机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }
  1. public class RacingCar extends AbstractCar {
  2. public RacingCar() {
  3. this.engine = "V8发动机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }

Factory:抽象工厂

将生产方法抽象化

  1. public abstract class AbstractCarFactory {
  2. public abstract AbstractCar newCar();
  3. }

ConcreteFactory:具体工厂

有多少个产品就有多少个工厂

  1. public class WulinMiniCarFactory extends AbstractCarFactory{
  2. @Override
  3. public AbstractCar newCar() {
  4. }
  5. }
  1. public class WulinRacingCarFactory extends AbstractCarFactory{
  2. @Override
  3. public AbstractCar newCar() {
  4. return new RacingCar();
  5. }
  6. }
  1. public class WulinVanCarFactory extends AbstractCarFactory{
  2. @Override
  3. public AbstractCar newCar() {
  4. return new VanCar();
  5. }
  6. }

测试类

  1. public static void main(String[] args) {
  2. AbstractCarFactory carFactory = new WulinRacingCarFactory();
  3. AbstractCar abstractCar = carFactory.newCar();
  4. abstractCar.run();
  5. carFactory = new WulinMiniCarFactory();
  6. AbstractCar abstractCar1 = carFactory.newCar();
  7. abstractCar1.run();
  8. carFactory = new WulinVanCarFactory();
  9. AbstractCar abstractCar2 = carFactory.newCar();
  10. abstractCar2.run();
  11. }

4. 抽象工厂(Abstract Factory)

05. 工厂(Factory)模式 - 图3

05. 工厂(Factory)模式 - 图4

将工厂抽象化 抽象方法为生产抽象类别,需要什么产品就创建什么工厂来生成。

抽象产品族:即抽象类别

  1. public abstract class AbstractCar {
  2. String engine;
  3. public abstract void run();
  4. }
  1. public abstract class AbstractMask {
  2. Integer price;
  3. public abstract void protecteMe();
  4. }

产品等级结构:生具体产品族的具体产品

  1. public class MiniCar extends AbstractCar {
  2. public MiniCar() {
  3. this.engine = "四缸发动机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }
  1. public class VanCar extends AbstractCar {
  2. public VanCar() {
  3. this.engine = "单杠柴油机";
  4. }
  5. @Override
  6. public void run() {
  7. System.out.println(engine + "被生产");
  8. }
  9. }
  1. public class N95Mask extends AbstractMask {
  2. public N95Mask() {
  3. this.price = 2;
  4. }
  5. @Override
  6. public void protecteMe() {
  7. System.out.println("N95口罩被生产 价位为" + price);
  8. }
  9. }
  1. public class CommonMask extends AbstractMask {
  2. public CommonMask() {
  3. this.price = 1;
  4. }
  5. @Override
  6. public void protecteMe() {
  7. System.out.println("普通口罩被生成 价格为" + price);
  8. }
  9. }

总厂规范:工厂全部产品族

可以再次细分工厂产品族,不生成的类别返回null,生成的类别为抽象(abstract)方法,让生成工厂实现单一类别的生成产品。

  1. /**
  2. * 总厂规范
  3. */
  4. public abstract class WulinFactory {
  5. abstract AbstractCar newCar();
  6. abstract AbstractMask newMask();
  7. }

生成工厂:生成指定产品族的指定产品

  1. public class WulinMiniCarFatory extends WulinFactory {
  2. @Override
  3. protected AbstractCar newCar() {
  4. return new MiniCar();
  5. }
  6. @Override
  7. AbstractMask newMask() {
  8. return null;
  9. }
  10. }
  1. public class WulinVanCarFatory extends WulinFactory {
  2. @Override
  3. protected AbstractCar newCar() {
  4. return new VanCar();
  5. }
  6. @Override
  7. AbstractMask newMask() {
  8. return null;
  9. }
  10. }
  1. public class WulinN95MaskFactory extends WulinFactory{
  2. @Override
  3. protected AbstractCar newCar() {
  4. return null;
  5. }
  6. @Override
  7. AbstractMask newMask() {
  8. return new N95Mask();
  9. }
  10. }
  1. public class WulinCommonMaskFactory extends WulinFactory{
  2. @Override
  3. protected AbstractCar newCar() {
  4. return null;
  5. }
  6. @Override
  7. AbstractMask newMask() {
  8. return new CommonMask();
  9. }
  10. }

测试方法:

  1. public static void main(String[] args) {
  2. WulinFactory wulinFactory = new WulinCommonMaskFactory();
  3. AbstractMask commonMask = wulinFactory.newMask();
  4. commonMask.protecteMe(); //只生成普通口罩
  5. wulinFactory = new WulinN95MaskFactory();
  6. AbstractMask N95 = wulinFactory.newMask();
  7. N95.protecteMe(); //生成N95
  8. wulinFactory = new WulinMiniCarFatory();
  9. AbstractCar miniCar = wulinFactory.newCar();
  10. miniCar.run();
  11. wulinFactory = new WulinVanCarFatory();
  12. AbstractCar vanCar = wulinFactory.newCar();
  13. vanCar.run();
  14. }

5. 工厂模式的退化

  • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式

6. 应用场景

  • NumberFormat、SimpleDateFormat
  • LoggerFactory:
  • SqlSessionFactory:MyBatis
  • BeanFactory:Spring的BeanFactory(就是为了造出bean)