简单工厂模式

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

核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 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. node.js从入门到放弃(一)

    以下内容全是我个人理解写出,如有不对,请立刻练习本人进行更改.以免被刚入门的被我带入坑里. —node是什么?我想大家应该都知道. node是前端未来干掉后端的一种语言,是用JavaScript来编写 ...

  2. Abaqus用户子程序umat的学习

    Abaqus用户子程序umat的学习 说明:在文件中,!后面的内容为注释内容.本文为学习心得,很多注释是自己摸索得到.如有不正确的地方,敬请指正. ! ------------------------ ...

  3. 【HIHOCODER 1052 】基因工程(贪心)

    链接 问题描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致. 例如对于序列"A ...

  4. c#如何判断textbox中输入的数据是datatime型的

    ()你好,标准的方法是用一个验证控件:RangeValidator,把type设为DateTime,最大值设为'3000-1-1'或者别的,最小值最好设为'1900-1-1'. ()程序里面自己验证: ...

  5. 【Codeforces 1083A】The Fair Nut and the Best Path

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们最后要的是一条最长的路径. 这条路径的权值和是所有点的权值和-所有边的权值和且这个值最大. 显然如果我们在某一条边上的累计的权值和< ...

  6. IDEA maven 无法加载已经安装的模块依赖包

    今天打包一直报如下错误 Reactor Summary for freechain-op 1.0.1.OP: [INFO] [INFO] freechain-op .................. ...

  7. javascript、jquery 、C#、sqlserveer、mysql、oracle中字符串截取的区别和用法

    下标从0开始 ,并且包括起始位 javascript 中字符串截取 : substring(Number start,Number end) var substr = "liuguangfa ...

  8. 【BFS+优先级队列】Rescue

    https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/I [题意] 给定一个n*m的迷宫,A的多个小伙伴R要去营救A,问需要时间最少的小 ...

  9. [NOIP2002] 提高组 洛谷P1031 均分纸牌

    题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...

  10. hdu3853:LOOPS

    题目大意:r*c个点,每个点有Aij的概率回到自己本身,Bij的概率向右一格,Cij的概率向下一格,求从(1,1)到(r,c)的期望步数. 题解:有了hdu4405的经验,从后往前推期望.那么,E(i ...