前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 (5)——工厂方法模式(Factory Method,创建型)

设计模式 (5)——工厂方法模式(Factory Method,创建型)

作者头像
恋喵大鲤鱼
发布2018-08-03 11:11:17
3480
发布2018-08-03 11:11:17
举报
文章被收录于专栏:C/C++基础C/C++基础

1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。

在前面的设计模式(四)——简单工厂模式中我们介绍了简单工厂模式,接下来将介绍下工厂方法模式,它同样是创建型设计模式,有相似之处,但又有些不同,文章的末尾会介绍他们之间的不同。

这里借用一下网上的资源,类图结构如下:

基类:抽象产品类。 子类:具体产品类。 工厂类:即抽象工厂类,提供了一个创建对象的方法,也称为“工厂方法”,该方法返回一个具体产品类的对象。 子类工厂:具体工厂类,实现抽象工厂类的“工厂方法”,来创建某个具体产品类实例。每一个子类工厂,负责创建一个具体产品类的对象。

2.工厂方法模式具体应用

请参考设计模式(四)——简单工厂模式这篇文章。 还是以生产比萨为例,比萨店需要根据客户订单,生产不同口味的比萨。这里比萨生产不是交由一个厨房生产,而是不同口味比萨交由不同厨房来专门制作。

还是以C++为例,首先实现我们的抽象比萨类和具体口味的比萨。

代码语言:javascript
复制
class Pizza {
public:
    virtual string getDescription() = 0;
};


//蛤蜊比萨
class ClamPizza :public Pizza {
    string name="蛤蜊比萨";
public:
    string getDescription() {
        return name + " 价格45元";
    }
};

//素食比萨
class VeggiePizza :public Pizza {
    string name = "素食比萨";
public:
    string getDescription() {
        return name+ " 价格26元";;
    }
};

//芝士比萨
class CheesePizza :public Pizza {
    string name = "比萨";
public:
    string getDescription() {
        return name + " 价格38元";;
    }
};

下面实现抽象工厂和制作不同口味比萨的厨房。

代码语言:javascript
复制
//抽象工厂,提供创建创建对象的接口createPizza()
class PizzaFactory {
public:
    virtual Pizza* createPizza() = 0;
};

//具体工厂类,创建蛤蜊比萨
class ClamPizzaFactory :PizzaFactory {
public:
    virtual Pizza* createPizza() {
        return new ClamPizza;
    }
};

//具体工厂类,创建素食比萨
class VeggiePizzaFactory :public PizzaFactory{
public:
    virtual Pizza* createPizza() {
        return new VeggiePizza;
    }       
};

//具体工厂类,创建芝士比萨
class CheesePizzaFactory :public PizzaFactory {
public:
    virtual Pizza* createPizza() {
        return new CheesePizza;
    }
};

下面开始生产我们需要的比萨。

代码语言:javascript
复制
int main() {

    Pizza* clamPizza = (new ClamPizzaFactory)->createPizza();   //实例化蛤蜊比萨
    cout<<clamPizza->getDescription()<<endl;
    Pizza* veggiePizza = (new VeggiePizzaFactory)->createPizza();   //实例化素食比萨
    cout << veggiePizza->getDescription() << endl;
    Pizza* cheesePizza = (new CheesePizzaFactory)->createPizza();   //实例化芝士比萨
    cout << cheesePizza->getDescription() << endl;
    system("pause");
}

程序输出结果:

代码语言:javascript
复制
蛤蜊比萨 价格45元
素食比萨 价格26元
比萨 价格38元

工厂方法模式实现也比较简单,上面的类结构图如下所示:

3.简单工厂和工厂方法模式的比较

简单工厂模式: 专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。其缺点就是生产新产品时需要更改简单工厂类的代码,这违背了开放封闭原则。

工厂方法模式: 提供创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。

下一篇将讲解抽象工厂模式,并与二者进行对比。

4.小结

(1)工厂方法模式属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。 (2)工厂方法模式坚持了依赖倒置原则,高层模块不依赖于底层模块,二者都依赖于抽象。高层模块是比萨店前台,底层模块是具体口味的披萨,二者都依赖抽象类Pizza。


参考文献

[1]简单工厂模式和工厂方法模式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.概述
  • 2.工厂方法模式具体应用
  • 3.简单工厂和工厂方法模式的比较
  • 4.小结
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档