设计模式 (四)——简单工厂模式(Simple Factory,创建型)

1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。简单工厂模式(Simple Factory Pattern)属于创建型模式。简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。

简单工厂模式类图结构:

SimpleFactory:简单工厂类,简单工厂模式的核心,它负责实现创建所有实例。简单工厂创建产品的方法可以被外界直接调用来创建所需的产品对象。 IProduct:抽象产品类,简单工厂模式创建的所有对象的父类,它负责描述所有实例所共有的公共函数接口。 ConcreteProduct:具体产品类,是简单工厂模式的创建目标。

2.简单工厂模式举例

假如比萨店现在需要建立一套点餐系统,需要将客户点的比萨加入到账单中。比萨店向客户推出了不同口味的比萨,有蛤蜊披萨(Clam Pizza)、素食披萨(Veggie Pizza)和芝士比萨(Cheese Pizza)等。这就用到了简单工厂模式。下面以C++来实现简单工厂模式:

创建抽象产品类Pizza

class Pizza {
public:
    //纯虚函数(抽象函数接口)
    virtual string getDescription() = 0;
};

创建具体产品类。接着我们创建各个口味的比萨,它们都继承了抽象父类Pizza ,并实现了父类的getDescription方法。

//蛤蜊比萨
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元";;
    }
};

创建简单工厂类。接下来创建一个简单工厂类,它提供了一个静态方法createPizza用来生产比萨。你只需要传入你想生产的比萨名称,它就会实例化相应比萨对象:

enum PizzaName {CLAM,VEGGIE,CHEESE};
class PizzaFactory {
public:
    static Pizza* createPizza(PizzaName name) {
        Pizza* pizza = nullptr;
        switch (name){
            case CLAM:
                pizza = new ClamPizza();
                break;
            case VEGGIE:
                pizza = new VeggiePizza();
                break;
            case CHEESE:
                pizza = new CheesePizza();
                break;
        }
        return pizza;
    }
};

客户端调用工厂类。客户端调用简单工厂类,传入不同口味比萨的名称生产出比萨并调用该对象getDescription()方法:

#include <iostream>  
#include <string>
using namespace std;

int main() {
    cout<<PizzaFactory::createPizza(CLAM)->getDescription()<<endl;
    cout<<PizzaFactory::createPizza(VEGGIE)->getDescription()<<endl;
    cout<<PizzaFactory::createPizza(CHEESE)->getDescription()<<endl;
}

程序输出结果:

蛤蜊比萨 价格45元
素食比萨 价格26元
比萨 价格38元

3.简单工厂模式使用场景和优缺点

使用场景: (1)工厂类负责创建的对象比较少。 (2)客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

优点: 使用户根据参数获得对应的类实例,避免了直接实例化类,降低用户代码与目标类间的耦合性。

缺点: 可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改简单工厂类,违背了开放封闭原则(Open Closed Principle) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

4.小节

(1)简单工厂模式满足了OO设计原则:为交互对象之间的松耦合设计而努力。 (2)简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。


参考

[1]设计模式(四)简单工厂模式 [2]Freeman E.,Freeman E.,Sierra K.,et al.设计模式[M].第一版O’Reilly Taiwan公司译.北京:中国电力出版社,2015:110-117

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

第九节 Go语言循环语句

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

872
来自专栏chenjx85的技术专栏

leetcode-69-Sqrt(x)

2944
来自专栏PPV课数据科学社区

零基础到精通Python,从这篇文章开始

关键词:Python,入门 正文: 本文由rever4433, Tocy, Tony, 南宫冰郁, 透过树叶的光等协作翻译,发表于开源中国。 什么是 Pytho...

3006
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第7章 面向对象编程(OOP)(1)第7章 面向对象编程(OOP)《Kotlin极简教程》正式上架:

在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。在本章节以及下一章中,我们将一起来学习Kotlin对面向对象编程以及函...

982
来自专栏写代码的海盗

我们是80后 golang入坑系列

现在这个系列,已经开始两极分化了。 点赞的认为风格轻松,看着不困。反之,就有人嫌写的罗里吧嗦,上纲上线。所以善意提醒,里面不只是技术语言,还有段子。专心看技术的...

3517
来自专栏Albert陈凯

Scala简介:面向对象和函数式编程的组合

Scala简介 “Scala是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。” Sc...

2796
来自专栏代码世界

Python之面向对象二

面向对象的三大特性: 继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 pyt...

4097
来自专栏带你撸出一手好代码

编程语言函数多返回值处理方式排名

一个函数一个返回值 , 这好像跟祖宗定下的规则似的,各个时代主流编程语言几乎都严格遵守着。然而, 在实际情况下, 程序员写代码经常会碰到一个函数会返回多个返回值...

4027
来自专栏Java呓语

工厂方法模式(延迟到子类来选择实现)

1、工厂方法模式理念介绍 2、它与简单方法模式的区别 3、推荐使用工厂方法的场景 4、在Android 源码中的应用

834
来自专栏向治洪

Scala入门

Scala入门 Scala简介 ps:在最新的薪资调查中,Scala程序员的工资是平均最高的Scala工资。 Scala是一门多范式的编程语言,一种类似java...

2017

扫码关注云+社区

领取腾讯云代金券