工厂模式

2018-08-13  本文已影响0人  luoqiang108

简单工厂模式(SimpleFactoryPattern)

1.定义

2.主要作用

将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。

即使用者可直接消费产品而不需要知道其生产的细节

3.模式原理

3.1UML类图
简单工厂模式UML.png
3.2模式组成
组成(角色) 关系 作用
抽象产品(Product) 具体产品的父类 描述产品的公共接口
具体产品(Concrete Product) 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
工厂(Creator) 被外界调用 根据传入不同参数从而创建不同具体产品类的实例

4.实例讲解

接下来我用一个实例来对简单工厂模式进行更深一步的介绍。

4.1实例概况
4.2使用步骤

实现代码如下:

步骤1. 创建抽象产品类,定义具体产品的公共接口
abstract class Product{
    public abstract void Show();
}
步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品
//具体产品类A
class  ProductA extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}

//具体产品类B
class  ProductB extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}

//具体产品类C
class  ProductC extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品C");
    }
}
步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
class  Factory {
    public static Product Manufacture(String ProductName){
    //工厂类里用switch语句控制生产哪种商品;
    //使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
        switch (ProductName){
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            case "C":
                return new ProductC();
            default:
                return null;
        }
    }
}
步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
//工厂产品生产流程
public class SimpleFactoryPattern {
    public static void main(String[] args){
        Factory mFactory = new Factory();

        //客户要产品A
        try {
        //调用工厂类的静态方法 & 传入不同参数从而创建产品实例
            mFactory.Manufacture("A").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品B
        try {
            mFactory.Manufacture("B").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品C
        try {
            mFactory.Manufacture("C").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品D
        try {
            mFactory.Manufacture("D").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
    }
}
结果输出:
生产出了产品A
生产出了产品C
生产出了产品C
没有这一类产品

5.优点

6.缺点

7.应用场景

在了解了优缺点后,我们知道了简单工厂模式的应用场景:


工厂方法模式(Factory Method)

工厂方法模式产生背景:为了解决简单工厂模式的缺点

1.定义

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

2.主要作用

之所以可以解决简单工厂的问题,是因为工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则,克服了简单工厂模式中缺点。

3.模式原理

3.1UML类图
工厂方法模式UML.png
3.2模式组成
组成(角色) 关系 作用
抽象产品(Product) 具体产品的父类 描述产品的公共接口
具体产品(Concrete Product) 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
抽象工厂(Abstract Factory) 具体工厂的父类 描述具体工厂的公共接口
具体工厂(Concrete Factory) 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

4.实例讲解

接下来我用一个实例来对工厂方法模式进行更深一步的介绍。

4.1实例概况

即工厂方法模式

4.2使用步骤

实现代码如下:

步骤1: 创建抽象产品类 ,定义具体产品的公共接口
abstract class Product{
    public abstract void Show();
}
步骤2: 创建具体产品类(继承抽象产品类), 定义生产的具体产品
//具体产品A类
class  ProductA extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}

//具体产品B类
class  ProductB extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}
步骤3: 创建抽象工厂类,定义具体工厂的公共接口
abstract class Factory{
    public abstract Product Manufacture();
}
步骤4:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
//工厂A类 - 生产A类产品
class  FactoryA extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductA();
    }
}

//工厂B类 - 生产B类产品
class  FactoryB extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductB();
    }
}
步骤5:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
//生产工作流程
public class FactoryPattern {
    public static void main(String[] args){
        //客户要产品A
        FactoryA mFactoryA = new FactoryA();
        mFactoryA.Manufacture().Show();

        //客户要产品B
        FactoryB mFactoryB = new FactoryB();
        mFactoryB.Manufacture().Show();
    }
}
结果输出:
生产出了产品A
生产出了产品B

5.优点

6.缺点

7.应用场景

在了解了优缺点后,我总结了工厂方法模式的应用场景:


抽象工厂模式(Abstract Factory)

1.定义

抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。

2.主要作用

允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。

3.模式原理

3.1UML类图
抽象工厂模式UML.png
3.2模式组成
组成(角色) 关系 作用
抽象产品族(AbstractProduct) 抽象产品的父类 描述抽象产品的公共接口
抽象产品(Product) 具体产品的父类 描述具体产品的公共接口
具体产品(Concrete Product) 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
抽象工厂(Factory) 具体工厂的父类 描述具体工厂的公共接口
具体工厂(Concrete Factory) 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

4.实例讲解

接下来我用一个实例来对抽象工厂模式进行更深一步的介绍。

4.1实例概况

即抽象工厂模式

4.2使用步骤

实现代码如下:

步骤1: 创建抽象产品族类 ,定义抽象产品的公共接口
abstract class AbstractProduct{
    public abstract void Show();
}
步骤2: 创建抽象产品类 ,定义具体产品的公共接口
//容器产品抽象类
abstract class ContainerProduct extends AbstractProduct{
    @Override
    public abstract void Show();
}

//模具产品抽象类
abstract class MouldProduct extends AbstractProduct{
    @Override
    public abstract void Show();
}
步骤3: 创建具体产品类(继承抽象产品类), 定义生产的具体产品
//容器产品A类
class ContainerProductA extends ContainerProduct{
    @Override
    public void Show() {
        System.out.println("生产出了容器产品A");
    }
}

//容器产品B类
class ContainerProductB extends ContainerProduct{
    @Override
    public void Show() {
        System.out.println("生产出了容器产品B");
    }
}

//模具产品A类
class MouldProductA extends MouldProduct{
    @Override
    public void Show() {
        System.out.println("生产出了模具产品A");
    }
}

//模具产品B类
class MouldProductB extends MouldProduct{
    @Override
    public void Show() {
        System.out.println("生产出了模具产品B");
    }
}
步骤4: 创建抽象工厂类,定义具体工厂的公共接口
abstract class Factory{
    public abstract AbstractProduct ManufactureContainer();
    public abstract AbstractProduct ManufactureMould();
}
步骤5:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
//A厂 - 生产模具+容器产品
class FactoryA extends Factory{
    @Override
    public AbstractProduct ManufactureContainer() {
        return new ContainerProductA();
    }

    @Override
    public AbstractProduct ManufactureMould() {
        return new MouldProductA();
    }
}

//B厂 - 生产模具+容器产品
class FactoryB extends Factory{
    @Override
    public AbstractProduct ManufactureContainer() {
        return new ContainerProductB();
    }

    @Override
    public AbstractProduct ManufactureMould() {
        return new MouldProductB();
    }
}
步骤6: 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
//生产工作流程
public class AbstractFactoryPattern {
    public static void main(String[] args){
        FactoryA mFactoryA = new FactoryA();
        FactoryB mFactoryB = new FactoryB();
        //A厂当地客户需要容器产品A
        mFactoryA.ManufactureContainer().Show();
        //A厂当地客户需要模具产品A
        mFactoryA.ManufactureMould().Show();

        //B厂当地客户需要容器产品B
        mFactoryB.ManufactureContainer().Show();
        //B厂当地客户需要模具产品B
        mFactoryB.ManufactureMould().Show();
    }
}
结果输出:
生产出了容器产品A
生产出了模具产品A
生产出了容器产品B
生产出了模具产品B

5.优点

6.缺点

抽象工厂模式很难支持新种类产品的变化。
这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。

7.应用场景

在了解了优缺点后,我总结了抽象工厂模式的应用场景:

说明:本篇博客是基于简书作者Carson_Ho的三篇关于工厂模式的博客,其实就是我把作者博客直接复制梳理成一篇了,除了改了几个小错误外基本没改动,希望大神不要介意啊,毕竟我是觉得自己梳理一遍怎么也比光看一遍强,可以加深不少印象。

上一篇 下一篇

猜你喜欢

热点阅读