23种设计模式之工厂方法模式-简单易懂的设计模式解析
程序员文章站
2022-06-17 12:19:04
...
文章目录
定义
工厂方法模式是一种创建型设计模式。,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
模式原理
- UML类图
- 模式组成
组成(角色) | 关系 | 作用 |
---|---|---|
抽象产品(Product) | 描述具体产品的公共接口 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
抽象工厂(Creator) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Creator) | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例 |
注:
- 让所有产品都遵循同一接口。 该接口必须声明对所有产品都有意义的方法
- 在创建类中添加一个空的工厂方法。 该方法的返回类型必须遵循通用的产品接口
实例
3.1 实例概况
背景:有一间加工厂(仅生产A类产品);随着客户需求的变化,客户需要生产B类产品;
冲突:改变原有加工厂的配置和变化非常困难,假设下一次客户需要再发生变化,再次改变将增大非常大的成本;
解决方案:工厂决定建造分厂B来生产B类产品;
即工厂方法模式
1、创建抽象工厂类,定义具体工厂的公共接口
abstract class Factory{
public abstract Product manufacture();
}
2、创建抽象产品类 ,定义具体产品的公共接口;
abstract class Product{
public abstract void show();
}
3、创建具体产品类(继承抽象产品类), 定义生产的具体产品
class ProductA extends Product{
@Override
public void show() {
System.out.println("生产-->产品A");
}
}
class ProductB extends Product{
@Override
public void show() {
System.out.println("生产-->产品B");
}
}
4、创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
class FactoryA extends Factory{
@Override
public Product manufacture() {
System.out.println("工厂A");
return new ProductA();
}
}
class FactoryB extends Factory{
@Override
public Product manufacture() {
System.out.println("工厂B");
return new ProductB();
}
}
5、调用
public class FactoryMethodPattern {
public static void main(String[] args) {
FactoryA factoryA = new FactoryA();
factoryA.manufacture().show();
FactoryB factoryB = new FactoryB();
factoryB.manufacture().show();
}
}
工厂方法模式优缺点
优点:
- 解耦。避免创建者和具体产品之间的紧密耦合。
- 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
- 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。
缺点:
- 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。
工厂方法模式应用场景
-
当你在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。 -
如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
-
如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。
上一篇: 前端技术-PS切图