-
说明一下:
- 简单工厂模式不属于23种GOF设计模式之一,我之所以写出来,是应为简单工厂模式是工厂模式的基础,23种中的工厂方法模式是从中衍生的。
-
简介:
- 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
-
简单工厂UML图:
-
组成:
-
简单工厂模式由三部分组成,具体工厂,具体产品,抽象产品。
- 工厂类:简单工厂的核心,
- 抽象产品:简单工厂模式所创建的对象的父类或者它们共同拥有的接口
- 具体产品:简单工厂模式所创建的任何对象都是这个角色的实现类
-
-
模拟场景:
- 一个生产汽车的工厂,现在要根据客户的需求来生产汽车,用简单工厂模式来实现
-
实现步骤:
- 创建抽象产品类,定义具体产品的公共接口
package com.lvsling.simplefactory; /** * 抽象产品角色 * @author Administrator * */ public abstract class Car { } |
- 创建具体产品类,定义生产的具体产品
package com.lvsling.simplefactory; /** * 具体产品角色:CarA * @author Administrator * */ public class CarA extends Car{ public CarA() { System.out.println("生产了一辆A型汽车!"); } } |
package com.lvsling.simplefactory; /** * 具体产品角色:CarB * @author Administrator * */ public class CarB extends Car{ public CarB() { System.out.println("生产了一辆B型汽车!"); } } |
- 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
package com.lvsling.simplefactory; /** * 简单工厂类 * @author Administrator * */ public class SimpleFactory { public SimpleFactory() { System.out.println("工厂已创建!"); } /** * 根据客户指定的类型carType,生产相应的车型车Car * * @param carType 车类型 * @return生产好的车 */ public static Car produceCar(String carType) { Car car = null; switch (carType) { case "A": car = new CarA(); break; case "B": car = new CarB(); break; default: break; } return car; } } |
- 创建一个client来调用工厂类的静态方法,传入不同的参数创建不同的具体产品类的实例
package com.lvsling.simplefactory; public class Client { public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); // 创建工厂 Car car_A = simpleFactory.produceCar("A"); // 生产A型车 Car car_B = simpleFactory.produceCar("B"); // 生产B型车 } } |
- 控制台打印结果
工厂已创建! 生产了一辆A型汽车! 生产了一辆B型汽车! |
-
优点:
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则
-
模式缺点:
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。所以说从工厂的角度来说简单工厂模式是不符合"开-闭"原则的。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
-
适用场景:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
-
总结:
- 简单工厂模式虽然不属于23种GOF设计模式,但是它是工厂模式的基础,在了解简单工厂模式后,才能更深入的学习工厂方法模式。