简单工厂模式

主要用于创建对象。 新加入类时。 不会影响曾经的系统代码。

核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 virtual 函数得到不同的结果.

以下以苹果手机的生产为例。模拟手机生产工厂。

苹果手机有各种不同的型号,有Iphone4、Iphone4s、Iphone5等等。

我们通过一个工厂来生产,client依据客户的需求生产不同型号的手机。

代码例如以下:

Apple.h

#pragma once
#include <iostream> class Apple
{
public:
Apple();
virtual ~Apple(); virtual void ShowVersion() = 0;
virtual void MakeCall(const std::string &num) = 0;
};

Apple.cpp

#include "Apple.h"

Apple::Apple()
{
} Apple::~Apple()
{
}

Apple4.h

#pragma once
#include "Apple.h" class Apple4 : public Apple
{
public:
Apple4();
~Apple4(); virtual void ShowVersion();
virtual void MakeCall(const std::string &num);
};

Apple4.cpp

#include "Apple4.h"
#include <iostream>
#include <string> using namespace std; Apple4::Apple4()
{
cout << "Apple4 Created!" << endl;
} Apple4::~Apple4()
{
}; void Apple4::ShowVersion()
{
cout << "I'm Apple4" << endl;
} void Apple4::MakeCall(const std::string &num)
{
cout << "I'm Call num :" << num << endl;
}

Apple4s.h

#pragma once
#include "Apple.h" class Apple4s : public Apple
{
public:
Apple4s();
~Apple4s(); virtual void ShowVersion();
virtual void MakeCall(const std::string &num);
};

Apple4s.cpp

#include "Apple4s.h"
#include <iostream>
#include <string> using namespace std; Apple4s::Apple4s()
{
cout << "Apple4s Created!" << endl;
} Apple4s::~Apple4s()
{
}; void Apple4s::ShowVersion()
{
cout << "I'm Apple4s" << endl;
} void Apple4s::MakeCall(const std::string &num)
{
cout << "I'm Call num :" << num << endl;
}

AppleFactory.h

#pragma once
#include "Apple.h"
#include <string> class AppleFactory
{
public:
AppleFactory();
~AppleFactory(); static Apple * MakePhone(const std::string &version);//声明为静态成员函数 };

AppleFactory.cpp

#include "AppleFactory.h"
#include "Apple4.h"
#include "Apple4s.h"
#include <iostream>
#include <string> AppleFactory::AppleFactory()
{
} AppleFactory::~AppleFactory()
{
} Apple * AppleFactory::MakePhone(const std::string &version)
{
if(version == "Apple4")
{
return new Apple4();
}
if(version == "Apple4s")
{
return new Apple4s();
}
return NULL;
}

main.cpp

#include "AppleFactory.h"
#include <iostream> int main()
{
Apple * A4 = AppleFactory::MakePhone("Apple4");
A4->ShowVersion();
A4->MakeCall("10086"); std::cout << "------------------" << std::endl; Apple * A4s = AppleFactory::MakePhone("Apple4s");
A4s->ShowVersion();
A4s->MakeCall("10010"); return 0;
} /*
执行结果: Apple4 Created!
I'm Apple4
I'm Call num :10086
------------------
Apple4s Created!
I'm Apple4s
I'm Call num :10010
请按随意键继续. . .
*/

这个模式也叫静态工厂模式,由于依赖的是工厂类中的静态方法。

设计模式C++实现_2_简单工厂模式的更多相关文章

  1. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  2. 设计模式(二)简单工厂模式(Simple Factory Pattern)

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...

  3. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  4. Unity C# 设计模式(二)简单工厂模式

    定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...

  5. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  6. C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...

  7. Java设计模式(三)简单工厂模式

    定义与类型 定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 适用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象 ...

  8. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  9. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

随机推荐

  1. android开发链接

    http://blog.csdn.net/zz2043191420/article/details/47338591

  2. 牛客网NOIP赛前集训营-提高组(第二场)A 方差

    链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中  表示序列的平 ...

  3. centos7 rsync+inotify软件实现集群服务的数据备份(二)

    上一篇文章记录了怎么安装rsync以及怎么使用该服务备份数据,但是在集群中需要实时备份客户发过来的相关数据,这样在使用命令或者定时任务的方式执行备份, 就满足不了整个服务的需求了. inotify是一 ...

  4. idea Error:(65, 27) java: 未结束的字符串文字

    今天在使用IDEA的时候,出现了这个错误,原因项目文件编码不一致导致的,解决方法是: 将项目的文件编码全改成一致(UTF-8),如下图所示:

  5. 条款9:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruction)

    NOTE:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)

  6. LeetCode(101)Symmetric Tree

    题目 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). Fo ...

  7. 牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间

    [题解] 我想到了两种解法. 一种是扫描线+线段树+单调栈. 另一种方法是O(n)的,比较巧妙. 考虑每个数在哪些区间可以作为最小数.最长的区间就是它向左右走,直到有数字比它小,这个可以用单调栈维护. ...

  8. fstream,sstream的学习记录

    fstream: #include<iostream> #include<fstream> using namespace std; int main(){ ofstream ...

  9. python基础——6(字符编码,文件操作)

    今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 *****     2.字符与字节: 字符占多少字节,字符串转化 ***     3.文件操作: 操作硬盘中的一块区域:读写操作  ...

  10. Fiddler抓包-会话框添加查看get与post请求类型选项

    from:https://www.cnblogs.com/yoyoketang/p/7061990.html 在使用fiddler抓包的时候,查看请求类型get和post每次只有点开该请求,在Insp ...