[设计模式]工厂方法模式

简介


工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让 子类决定实例化哪一个类。工厂方法使一个类的实例化 延迟到其他子类。 
工厂模式是一种 类创建型模式可参考 设计模式 创建型模式)。


结构


图-工厂方法模式结构图

Product : 定义产品对象的接口。

abstract  class Product {
     public  abstract  void Use();
}

ConcreteProduct : 实现 Product 接口。

class ConcreteProduct  extends Product {
     public ConcreteProduct() {
        System.out.println("创建 ConcreteProduct 产品");
    }

    @Override
     public  void Use() {
        System.out.println("使用 ConcreteProduct 产品");
    }
}

Creator : 声明工厂方法,它会返回一个产品类型的对象Creator 也可以实现一个默认的工厂方法 FactoryMethod() ,以返回一个默认的具体产品类型。

interface Creator {
     public Product FactoryMethod();
}

ConcreteCreator : 覆写 Creator 中的工厂方法 FactoryMethod()

class ConcreteCreator  implements Creator {
    @Override
     public Product FactoryMethod() {
         return  new ConcreteProduct();
    }
}

测试代码

public  class FactoryMethodPattern {
     public  static  void main(String[] args) {
        Creator factory =  new ConcreteCreator();
        Product product = factory.FactoryMethod();
        product.Use();
    }
}

运行结果

创建 ConcreteProduct 产品
使用 ConcreteProduct 产品

 

动机


当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将是代理者的帮助子类的信息局部化的时候。


要点


1、工厂模式中,增加一种产品类,就要增加一个工厂类。

因为每个工厂类只能创建一种产品的实例。

2、工厂模式遵循开放-封闭原则。

工厂模式中,新增一种产品并不需要修改原有类,仅仅是扩展。

 

实例


还是以 简单工厂模式 里的例子来进行说明。

如何实现一个具有加减乘除基本功能的计算器? 

两种模式的 Product 和 ConcreteProduct 角色代码没有区别,不再赘述。

差异在于 Factory 角色部分,以及客户端部分,请在代码中体会。

Creator 角色

//  Creator 角色,定义返回产品实例的公共工厂方法
interface OperationFactory {
     public Operation FactoryMethod();
}

ConcreteCreator 角色

和简单工厂模式相比,每一种产品都会有一个具体的工厂类负责生产实例。

//  ConcreteCreator 角色,具体实现 Creator 中的方法
class AddFactory  implements OperationFactory {
    @Override
     public Operation FactoryMethod() {
         return  new Add();
    }
}

//  ConcreteCreator 角色,具体实现 Creator 中的方法
class SubFactory  implements OperationFactory {
    @Override
     public Operation FactoryMethod() {
         return  new Sub();
    }
}

//  ConcreteCreator 角色,具体实现 Creator 中的方法
class MulFactory  implements OperationFactory {
    @Override
     public Operation FactoryMethod() {
         return  new Mul();
    }
}

//  ConcreteCreator 角色,具体实现 Creator 中的方法
class DivFactory  implements OperationFactory {
    @Override
     public Operation FactoryMethod() {
         return  new Div();
    }
}

Client 角色

与简单工厂模式中无需关注具体创建不同,工厂模式中需要指定具体工厂,以负责生产具体对应的产品。

//  Client 角色,需要指定具体工厂,以负责生产具体产品
public  class FactoryMethodPattern {
     public  static  void main(String[] args) {    
        OperationFactory factory =  new SubFactory();
        Operation oper = factory.FactoryMethod();
        oper.numA = 3;
        oper.numB = 2;
         double result = oper.getResult();
        System.out.println("result = " + result);
    }
}

C++版工厂方法模式

以下为一个C++版的工厂方法模式例子。

假设有两个台灯制造工厂,一个专门生产红色的灯,一个专门生产蓝色的灯。

在客户端里,我们实例化蓝灯工厂,来生产一个蓝灯。

ExpandedBlockStart.gif
#include  " stdafx.h "
#include < string>
#include <iostream>
using  namespace std;

// Product
class Light
{
public:
     virtual  void TurnOn()  =  0;
     virtual  void TurnOff() =  0;
};

class BlueLight :  public Light
{
public:
     void TurnOn()
    {
        cout <<  " Turn on BlueLight. " << endl;
    }

     void TurnOff()
    {
        cout <<  " Turn off BlueLight. " << endl;
    }
};

class RedLight :  public Light
{
public:
     void TurnOn()
    {
        cout <<  " Turn on RedLight. " << endl;
    }

     void TurnOff()
    {
        cout <<  " Turn off RedLight. " << endl;
    }
};

// Factory
class Factory
{
public:
     virtual Light* CreateLight() =  0;
};

class BlueLightFactory :  public Factory
{
public:
    Light* CreateLight()
    {
         return  new BlueLight;
    }
};

class RedLightFactory :  public Factory
{
public:
    Light* CreateLight()
    {
         return  new RedLight;
    }
};

int main()
{
    Factory *pBlueLightFactory =  new BlueLightFactory;
    Light *pBlueLight = pBlueLightFactory->CreateLight();
    
    pBlueLight->TurnOn();
    pBlueLight->TurnOff();

     free(pBlueLight)
     free(pBlueLightFactory);
    
     return  0;
}
View Code

 

简单工厂模式 vs. 工厂方法模式

简单工厂模式相比于工厂方法模式

优点:工厂类中包含必要的逻辑判断,可根据客户端的选择条件动态实例化需要的类。对于客户端来说,去除了对具体产品的依赖。

缺点:违背了开放封闭原则。 每添加一个新的产品,都需要对原有类进行修改。增加维护成本,且不易于维护。

开发封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。


推荐阅读


本文属于 设计模式系列

简单工厂模式属于工厂模式家族,欢迎参考阅读 简单工厂模式抽象工厂方法模式


参考资料


《大话设计模式》

《HeadFirst设计模式》
工厂方法模式是一种常见的创建型设计模式,它定义了一个用于创建对象的接口,但是由子类决定要实例化的类是哪一个。在工厂方法模式中,创建对象的过程被分离出来,使得这个过程可以被子类定制化,从而提高了代码的可扩展性和可维护性。 工厂方法模式的核心思想是将对象的创建和使用分离开来,客户端只需要知道所需对象的类型,而无需关心对象的创建过程。具体来说,工厂方法模式包含以下几个角色: 1. 抽象工厂(Abstract Factory):定义了工厂方法的接口,用于创建产品对象。 2. 具体工厂(Concrete Factory):实现抽象工厂接口,根据具体需求创建具体产品对象。 3. 抽象产品(Abstract Product):定义了产品的接口,用于描述产品的属性和行为。 4. 具体产品(Concrete Product):实现抽象产品接口,提供具体的实现。 使用工厂方法模式可以将客户端代码和具体产品的实现代码分离开来,使得代码更加灵活和可扩展。工厂方法模式在实际应用中也有很多场景,例如: 1. 当一个类不知道它所必须创建的对象的类的时候。 2. 当一个类希望由它的子类来指定所创建的对象的时候。 3. 当类将创建对象的职责委托给多个帮助子类中的某个特定子类,并且希望能够在运行时切换这些子类中的哪一个时。 总之,工厂方法模式是一种非常实用的设计模式,可以提高代码的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值