创建型模式——工厂方法模式

创建型模式——工厂方法模式

(一)概述

工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method是一个类的实例化延迟到其子类。

在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

在这里插入图片描述

(二)模式组成

在工厂方法模式中主要有以下几个角色:

  1. 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中这个角色由Java接口Creator扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
  2. 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
  3. 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java 接口Product扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
  4. 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

在这里插入图片描述

(三)使用步骤

工厂方法模式使用非常简单,主要分为下面五个步骤:

步骤1: 创建抽象工厂类,定义具体工厂的公共接口;
步骤2: 创建抽象产品类 ,定义具体产品的公共接口;
步骤3: 创建具体产品类(继承抽象产品类) ,定义生产的具体产品;
步骤4:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

下面我们来看一个具体的例子来感受一下工厂方法模式:

步骤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() {
    
    
        return new ProductA();
    }
}
class FactoryB extends Factory{
    
    
    @Override
    public Product Manufacture() {
    
    
        return new ProductB();
    }
}

步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

//生产工作流程
public class FactoryPattern {
    
    
    public static void main(String[] args){
    
    
        FactoryA mFactoryA = new FactoryA();
        mFactoryA.Manufacture().Show();

        FactoryB mFactoryB = new FactoryB();
        mFactoryB.Manufacture().Show();
    }
}

(四)特点

作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。

工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。但是,虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加,这也是他最大的缺陷之一。

2020年7月10日

猜你喜欢

转载自blog.csdn.net/weixin_43907422/article/details/107242109