简单工厂模式

一、简单工厂模式的相关概念:

1、定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。

其核心思想就是有一个专门的工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

2、举例:如卖水果,每种水果有不一样的价钱,那么就可以将水果作为抽象产品,而苹果,香蕉等作为具体产品

3、UML图如下:

每个类的主要功能:

简单工厂:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

二、C++程序示例

  1 // 简单工厂模式.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 #include<string>
  7 using namespace std;
  8 
  9 //抽象产品
 10 class fruit
 11 {
 12 public:
 13     fruit();
 14     virtual ~fruit();
 15     //由于此类是抽象类,没有价格,所以只能将价格显示定义为纯虚函数
 16     virtual void show_price()=0;
 17 };
 18 fruit::fruit()
 19 {}
 20 fruit::~fruit()
 21 {}
 22 
 23 //具体产品1
 24 class apple :public fruit
 25 {
 26 public :
 27     apple();
 28     virtual ~apple();
 29     virtual void show_price();
 30 };
 31 apple::apple()
 32 {
 33     cout<<"i am an apple"<<endl;
 34 }
 35 apple::~apple()
 36 {}
 37 void apple::show_price()
 38 {
 39     cout<<"my price is 5"<<endl;
 40 }
 41 
 42 //具体产品2
 43 class orange :public fruit
 44 {
 45 public :
 46     orange();
 47     virtual ~orange();
 48     virtual void show_price();
 49 };
 50 orange::orange()
 51 {
 52     cout<<"i am an orange"<<endl;
 53 }
 54 orange::~orange()
 55 {}
 56 void orange::show_price()
 57 {
 58     cout<<"my price is 6"<<endl;
 59 }
 60 //简单工厂
 61 //输入要创建实例的编号,创建对应实例,1:apple,2:orange
 62 class fruit_samplefactory
 63 {
 64 public:
 65     fruit_samplefactory();
 66     ~fruit_samplefactory();
 67 public:
 68     //此处一定要声明为静态成员函数,因为非静态成员,必须首先实例化一个类对象,才能使用
 69     static fruit* creat_fruit(int name_num);
 70     //fruit* creat_fruit(int name_num);
 71 };
 72 fruit_samplefactory::fruit_samplefactory()
 73 {
 74 
 75 }
 76 fruit_samplefactory::~fruit_samplefactory()
 77 {
 78 
 79 }
 80 fruit* fruit_samplefactory::creat_fruit(int name_num)
 81 {
 82     switch(name_num)
 83     {
 84     case 1:
 85             return new apple;
 86             break;
 87     case 2:
 88             return new orange;
 89             break;
 90     default:
 91         cout<<"您输入的类型不存在"<<endl;
 92         return NULL;
 93         break;
 94     }
 95 }
 96 
 97 //用户界面
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     int num=2;
101     fruit* orange=NULL;
102     orange=fruit_samplefactory::creat_fruit(num);
103     orange->show_price();
104     delete orange;
105     orange=NULL;
106     return 0;
107 }

注意问题:1、第16行show_price(),由于fruit是抽象产品,没有价格,所以此处一定要用纯虚函数                    虚函数是一定要在类中声明并定义的,而纯虚函数可以在类中声明而不定义,而在子类中进行定义

              2、由于第102行调用creat_fruit(num);的时候并没有将orange实例化为fruit_samplefactory类,而因为非静态成员,必须首先实例化一个类对象,才能使用。

                   所以要将69行中creat_fruit(num);声明为静态成员函数static fruit* creat_fruit(int name_num);估计这就是简单工厂模式又叫做静态工厂模型的原因吧。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

抽象类和接口的区别

【编者按】本文作者是Sebastian Malaca,是面向对象编程的狂热者,不断深化研究整洁代码和高代码质量。本文中,作者通过多个方面深入剖析抽象类和接口的区...

240100
来自专栏IMWeb前端团队

神奇运算符

每一门编程语言的设计都离不开运算符,我们写的每一行代码基本也少不了它们,这篇文章就让我们一起来了解一下这个无处不在的小伙伴的应用和小技巧吧~~ ~ 按位取反 字...

23290
来自专栏Python爬虫与数据挖掘

Python大神用一道题带你搞定Python函数中形参和实参问题

昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被...

15710
来自专栏大史住在大前端

野生前端的数据结构练习(9)冒泡排序,选择排序,插入排序

bubble sort的是最基本的算法,被誉为永远会被考从来不被用的算法,基本原则是大数右移,每轮遍历后最右侧的数是最大的,所以下一轮循环时可不予考虑,时间复杂...

8920
来自专栏noteless

工厂方法模式 创建型 设计模式(三)

核心的工厂角色,不再是具体的工厂,也就是不再负责所有具体产品的创建,进一步转变为抽象角色。

10520
来自专栏我是业余自学C/C++的

基数排序

16240
来自专栏较真的前端

看到这题后还敢说自己精通Promise吗?

19020
来自专栏Albert陈凯

scala的option和some

对于学习 Scala 的 Java™ 开发人员来说,对象是一个比较自然、简单的入口点。在 本系列 前几期文章中,我介绍了 Scala 中一些面向对象的编程方法,...

29550
来自专栏Java后端技术栈

Java提供的排序算法是怎么实现的?快排?

前几天整理的一套面试题,其中有一个问题就是Java的JDK中我们见到的Collections.sort()和Arrays.sort()这两个排序算法的实现方式是...

19830
来自专栏木制robot技术杂谈

谈一谈Python中str()和repr()的区别

前言 在学习BeautifulSoup文档的时候发现了一个以前不常见的Python内建函数repr(),带着好奇对这个内建函数进行了一番搜索和学习。 总结 s...

38940

扫码关注云+社区

领取腾讯云代金券