(二)工厂方法模式-C++实现
工厂方法模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类。 Factory method使一个类的实例化延迟到子类。
当系统准备为用户提供某个类的子类的实例,又不想让用户代码和孩子类形成耦合时,可以使用工厂方法模式来设计系统。
工厂方法模式的关键在于工厂接口里面有一个抽象方法,在具体工厂中,这个方法返回某个产品的实例。
工厂方法模式中有四个角色:
1、构造者(Factory)
2、具体构造者(Concrete Factory)
3、抽象产品(Product)
4、具体产品(Concrete Product)
在实际的依赖关系中,构造者(工厂)会依赖产品。
本文C++实现的例子中,圆珠笔是用户需要的,而笔芯是具体产品,所以定义了PenCore作为抽象产品,构造者是生产圆珠笔的工厂BallPen,因为有三种具体产品,所以相应的也有三种具体构造者。
总共有5个文件,两个头文件,两个源文件,一个主函数作为测试文件。
1、Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
#include <iostream>
#include <string>
#include "Product.h"
using namespace std; class PenCore; //抽象工厂-这里是钢笔类
class BallPen
{
public:
BallPen(){}; virtual ~BallPen(){} virtual PenCore* getPenCore() = ; }; //具体工厂
class RedBallPen : public BallPen
{
public:
PenCore* getPenCore();
}; class BlueBallPen : public BallPen
{
public:
PenCore* getPenCore();
}; class BlackBallPen : public BallPen
{
public:
PenCore* getPenCore();
}; #endif
2、Factory.cpp
#include "Factory.h" PenCore* RedBallPen::getPenCore()
{
PenCore *pen = new RedPenCore();
return pen;
} PenCore* BlueBallPen::getPenCore()
{
PenCore *pen = new BluePenCore();
return pen;
} PenCore* BlackBallPen::getPenCore()
{
PenCore *pen = new BlackPenCore();
return pen;
}
3、Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <iostream>
#include <string>
using namespace std; //抽象产品类
class PenCore
{
public:
PenCore(){} virtual ~PenCore(){} virtual void writeWord(string s) = ; public:
string color;
}; //具体产品类
class RedPenCore : public PenCore
{
public:
RedPenCore(); void writeWord(string s);
}; class BluePenCore : public PenCore
{
public:
BluePenCore(); void writeWord(string s); }; class BlackPenCore : public PenCore
{
public:
BlackPenCore(); void writeWord(string s); };
#endif
4、Product.cpp
#include "Product.h" RedPenCore::RedPenCore()
{
color = "Red";
} void RedPenCore::writeWord(string s)
{
cout << "write " << color << " " << s << endl;
} BluePenCore::BluePenCore()
{
color = "Blue";
} void BluePenCore::writeWord(string s)
{
cout << "write " << color << " " << s << endl;
} BlackPenCore::BlackPenCore()
{
color = "Black";
} void BlackPenCore::writeWord(string s)
{
cout << "write " << color << " " << s << endl;
}
5、VirtualConstructorTest.cpp
#include "Factory.h"
#include "Product.h" int main()
{
BallPen *ballPen = new BlueBallPen();
PenCore *pen = ballPen->getPenCore();
pen->writeWord("hello");
delete pen;
pen = NULL;
delete ballPen;
ballPen = NULL; ballPen = new RedBallPen();
pen = ballPen->getPenCore();
pen->writeWord("world");
delete ballPen;
ballPen = NULL;
delete pen;
pen = NULL; return ;
}
C++中实现要注意的是,首先工厂中的抽象方法返回类型是抽象产品的指针,然后在C++中自己new的对象一定要delete,防止内存泄露。
与java不同的是,在C++中,抽象工厂中的构造函数并不能调用自己另外的纯虚函数,因为这个函数需要子类实现之后才能调用,而在java中确可以。
(二)工厂方法模式-C++实现的更多相关文章
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 创建型模式(二) 工厂方法模式(Factory Method)
一.动机(Motivation) 在软件系统创建过程中,经常面临着"某个对象"的创建工作:由于需求的变化,这个对象(的具体实现)经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 设计模式(二)—工厂方法模式
凡是出现了大量的实例需要创建,而且具有共同的接口时,可以通过工厂方法模式进行创建. 一个接口: Sender public interface Sender{ public void sen ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
随机推荐
- GitHub学习心得之 安装配置与多帐号管理
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 GitHub学习心得之 安装配置与多帐号管理 1.前言2.GitHub Linux安装(ub ...
- Autodesk 最新开发技术研讨会-北京-上海-武汉-成都-西安-PPT下载
经过半月的奔波,转遍祖国大好河山.结论,还是喜欢成都,安逸~,好希望能在成都生活,竹林里品茶,不亦乐乎~ 如果你没能参加我们的研讨会,下面的PPT供参考: 面向世界.面向未来 – Autodesk 云 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q78-Q80)
Question 78 You are designing an application configuration approach for a custom SharePoint 2010 app ...
- 兼容Android的水波纹效果
Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...
- 【即时通讯】即时通讯及XMPP概述及…
在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...
- iOS 单例传值遇见问题
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 我的Android第三章:Android的组件介绍
小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数 ...
- iOS 学习 - 11.圆角(小于等于四个)类似气泡和计算字符高度
使用贝塞尔曲线, // 小于四个角 圆角 -(void)setbor{ NSString *str = @" couldn't fit this all in a comment to @l ...
- 用Objective-C写了一个简单的批量更改文件名的程序
前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的 ...
- MojoDatabase 源码学习之对象映射
Mojo-database是我个人比较喜欢多开源项目,下文是该项目打介绍和地址: mojo-database 简介: MojoDatabase is an ActiveRecord-like ORM ...