1.定义
• 简单工厂模式属于创建型模式,又叫作静态工厂方法模式,这是由一个工厂对象决定创建出哪一种产品类的实例。
• 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
2.模式原理
2.1 模式组成
组成(角色) | 关系 | 作用 |
抽象产品类(Product) | 具体产品的父类 | 描述产品的公共接口 |
具体产品类(Concrete Product) | 抽象产品的子类;工厂类创建的目标类 | 描述具体的产品 |
工厂类(Factory) | 简单工厂模式的核心类 | 被外界直接调用,根据条件创建所需的产品对象 |
2.2 模式UML图解
UML图
2.3使用步骤
• 创建一个抽象产品类,定义具体产品的公共接口;
• 创建具体产品类(继承自抽象产品类),定义生产的具体产品;
• 创建一个工厂类,它提供了一个静态方法,可以根据不同的条件来创建不同具体产品的实例。
• 客户端调用工厂类,通过传入不同的参数来完成不同具体产品实例的创建。
3.简单工厂模式的简单实现
3.1 实例描述:
假设有一个计算机的代工生产商,它目前已经可以代工生产联想计算机了。随着业务的拓展,这个代工生产商还要生产惠普和华硕的计算机。这样我们就需要一个单独的类来专门生产计算机,这就用到了简单工厂模式。
3.2 实现步骤
步骤一:创建抽象产品类,定义具体产品的公共接口
public abstract class Computer {
public abstract void start();
}
步骤二:创建具体产品类(继承抽象产品类),定义生产的具体产品
public class LenovoComputer extends Computer{
@Override
public void start() {
System.out.println("联想计算机启动");
}
}
public class HpComputer extends Computer{
@Override
public void start() {
System.out.println("惠普计算机启动");
}
}
public class AsusComputer extends Computer{
@Override
public void start() {
System.out.println("华硕计算机启动");
}
}
步骤三:创建一个工厂类,供外部调用,通过静态方法从而根据传入的不同的参数创建不同具体产品类的实例
public class ComputerFactory {
public static Computer createrComputer(String type) {
Computer mComputer = null;
switch (type) {
case "lenovo":
mComputer = new LenovoComputer();
break;
case "hp":
mComputer = new HpComputer();
break;
case "asus":
mComputer = new AsusComputer();
break;
}
return mComputer;
}
}
步骤四:客户端调用工厂类
public class CreateComputer {
public static void main(String[] args) {
ComputerFactory.createrComputer("hp").start();
}
}
4.简单工厂模式的优缺点
4.1 优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
4.2 缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
5.简单工厂模式的使用场景
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
- 当工厂类负责创建的对象(具体产品)比较少时。