欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

23种设计模式之工厂方法模式-简单易懂的设计模式解析

程序员文章站 2022-06-17 12:19:04
...

定义

       工厂方法模式是一种创建型设计模式。,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型

模式原理

  • UML类图
    23种设计模式之工厂方法模式-简单易懂的设计模式解析
  • 模式组成
组成(角色) 关系 作用
抽象产品(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();
    }
}

工厂方法模式优缺点

优点:

  • 解耦。避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  • 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

缺点:

  • 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。

工厂方法模式应用场景

  • 当你在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
           例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。

  • 如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。

  • 如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。

本文参考于工厂方法模式(Factory Method)- 最易懂的设计模式解析