简单工厂模式

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

核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 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. 【简●解】POJ 1185,LG P2704【炮兵阵地】

    POJ 1185,LG P2704[炮兵阵地] 状压经典入门. [传送门] POJ 1185 洛谷 P2704 [题目大意] 司令部的将军们打算在 \(N\times M\) 的网格地图上部署他们的炮 ...

  2. composer 设置代理

    在命令行终端中输入以下内容: export https_proxy='192.168.1.133:1080' export http_proxy='192.168.1.133:1080' 此前提是你已 ...

  3. Linux下安装Redis5.0.2

    1.下载redis 地址 http://download.redis.io/releases/redis-5.0.2.tar.gz 2.解压tar -zxf redis-5.0.2.tar.gz 3. ...

  4. 9. InnoDB通用表空间

    9. InnoDB通用表空间 通用表空间是InnoDB 使用CREATE TABLESPACE语法创建的共享表空间.本节中的以下主题描述了常规表空间功能和功能: 通用表空间功能 创建通用表空间 将表添 ...

  5. js事件默认行为

    事件默认行为: 当一个事件发生的时候浏览器自己默认做的事情 怎么阻止? 当前这个行为是什么事件触发的,然后在这个事件的处理函数中使用 return false; 但是return false 阻止的是 ...

  6. 小白安装Python环境详细步骤!

    昨天,有小伙伴向我反映,他对我说“你好像还没教过我安装Python的吧?”听到这句话,我不禁汗颜起来,我的确好像没太注意Python学习的基础了,一直发各种爬虫与初学者看不懂的代码,在此我要向我的读者 ...

  7. 对于单片机工程.h头文件的管理

    最近工程管理过于混乱,学习了一些工程头文件管理的方法,现在做一个记录,也分享给大家. 目前有两种管理文件的方式: 1.每一个功能模块对应一个文件夹,里面包含一个.c和一个.h文件如下图所示 这样做的好 ...

  8. LINUX常用文件说明

    一.网络配置 1.修改主机名 /etc/sysconfig/network或/etc/hosts 2.开启或关闭网卡 ifconfig eth0 down/up 3.linuxa下查看一个网卡绑定的所 ...

  9. luogu4093 [HEOI2016/TJOI2016]序列

    因为一个变化只会变化一个值,所以 \(dp[i]=max(dp[j])+1,j<i,maxval_j \leq a[i], a[j] \leq minval_i\) 发现跟二维数点问题挺像,树状 ...

  10. 【MVC 2】MVC+EF框架结构实例:注册ID号验证

    导读:本篇博客,将通过一个实例,详细介绍MVC+EF的应用.原理性的东西或者说是进一步的解耦和,请看博客: [框架结构 3]MVC+EF实体框架-原理解析.在这里,仅用MVC框架和一个EF生成的Mod ...