设计模式 笔记 工厂方法 Factory Methon
//---------------------------15/04/09----------------------------
//factory method 工厂方法-------对象创建型模式
/*
1:意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method使一个类的实例化延迟到其子类。
2:别名:
虚构造器(virtual constructor)
3:动机:
4:适用性:
1>当一个类不知道它所必须创建的对象的类的时候。
2>当一个类希望由它的子类来指定它所创建的对象的时候。
3>当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者
这一信息局部化的时候。
5:结构:
Product Creator:
| FactorMethod()
| AnOperation(){product = FactoryMethod();...}
| |
ConcreteProduct<- - - -ConcreteCreator:
FactoryMethod()
{return new ConcereteProduct;}
6:参与者:
1>Product:定义工厂方法所创建的对象的接口。
2>ConcreteProduct:实现Product接口。
3>Creator:
1)声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个
工厂方法的缺省实现,它可以返回一个缺省的ConcreteProduct对象。
2)可以调用工厂方法以返回一个ConcreteProduct实例。
4>ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。
7:协作:Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
8:效果:
1>工厂方法只提供了一个处理Product的接口,所以
可以和用户定义的任何ConcreteProduct类一起使用。
2>潜在缺点:客户为了创建一个特定的ConcreteProduct对象就不得不创建Creator子类。
3>另外两种效果:
1)为子类提供挂钩(hook)。也就是自己先实现一个默认版本的对象,子类可以根据需求
自行决定是否覆盖父类的版本,自己创建一个特定的对象。
2)连接平行的类层次。(感觉和hook没区别啊<未知标记>)
9:实现:
1>主要有两种不同的情况:
1)Creator类事一个抽象类并且不提供它所声明的工厂方法的实现:
需要子类定义实现,因为没有合理的缺省实现,所以避免了不得
不实例化不可预见类的问题。
2)Creator是一个具体的类并且为工厂方法提供一个缺省的实现:
子类可以在必要时改变父类所实例化的对象的类,所以很灵活。
2>参数化工厂方法:提供一个参数来决定实例化什么特定的类: */
class Creator
{
public:
virtual Product* Create(ProductId);
};
Product* Creator::Create(ProductId id)
{
if(id == MINE)
returnnew MyProduct;
if(id == YOURS)
returnnew YourProduct;
return
;
}
// 子类可以这么重定义:
Product* MyCreator::Create(ProductId id)
{
if(id == YOURS)
returnnew MyProduct;
if(id == MINE)
returnnew YourProduct;
if(id == THEIRS)
returnnew TheirProduct;
return Create::Create(id);
}
// 记得最后要调用父类的Create,因为,子类可能有些情况没有处理到,必须交给父类来处理。
// 3>使用模版避免创建子类:
template<class TheProduct>
class StandardCreator:public Creator
{
public:
virtual Product* Create()
{
return
new TheProduct;
}
};
/*
这样客户就可以自己提供产品类放入模版中。而不需要我们创建Creator的子类。
4>命名约定:使用命名约定是一个好习惯,它可以清楚地说明你正在使用的工厂方法。
10:代码示例: */
//Creator:
class MazeGame
{
public:
Maze* CreateMaze();
virtual Maze* MakeMaze()
const
{return
new Maze;}
virtual Room* MakeRoom(int n)const
{return
new Room(n);}
virtual Wall* MakeWall()
const
{return
new Wall;}
virtual Door* MakeDoor(Room* r1, Room* r2)
const
{return
new Door(r1,r2);}
};
//Maze Room Wall Door 都是Product
//ConcreteCreator:
class BombedMazeGame :public MazeGame
{
public:
BombedMazeGame();
virtual Wall* MakeWall()
const
{return
new BombedWall;}
virtual Room* MakeRoom(int n)const
{return
new RoomWithABomb(n);}
};
//如果客户想要一个带Bombed的迷宫,只需要创建一个BombedMazeGame调用CreateMaze即可。
设计模式 笔记 工厂方法 Factory Methon的更多相关文章
- 设计模式二: 工厂方法(Factory Method)
简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- C#设计模式-2工厂方法模式(Factory Method)
什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买.但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往 ...
- 23种设计模式之工厂方法(Factory Method Pattern)
工厂方法 前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例.在同一等级结构中,支持增加任意产品这种设 ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- php设计模式之工厂方法模式
php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
随机推荐
- Jemeter 连接数据库
1.打开Jmeter添加测试计划,(http://central.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-j ...
- python 流程控制(条件语句)
1,python流程控制单条件基本语句 2,python流程流程多条件控制语句 3,三元运算 1,python流程控制单条件基本语句 if 判断条件: 执行语句…… else: 执行语句…… 判断条件 ...
- C# 实现 JAVA AES加密解密[原创]
以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...
- MySQL crash-safe replication(1)
MySQL 5.6 对复制功能提供了新特性:slave 支持 crash-safe,可以解决之前版本中系统异常断电可能导致的 SQL thread 信息不准确的问题. 原文:Enabling cras ...
- 监控文件内容变化,即时写入到新文件(tail)
监控文件a,如有新内容写入,即时将新内容写入到新文件aa中: fw=open('e:\\aa.txt','ab') with open('e:\\a.txt','rb') as fo: while T ...
- IIS 安全设置
这近网站中毒,以下把IIS安全设置记录一下,以便查阅. 1.对于不需要执行的目录,将处理程序映射中的编辑功能权限中的脚本去掉,这样即使上传了木马文件在此目录,也是无法执行的. 删除IIS默认的匿名用户 ...
- git bash安装和基本设置
Part1:安装步骤 1.下载地址: https://git-for-windows.github.io/ 2.下载完成后安装,安装路径自己选择,其他的选项参照下图: 其他的一步一步往下即可,最后Fi ...
- Alpha事后诸葛亮(阳光普照队)
Alpha事后诸葛亮 设想和目标 1.实现文字识别,以用户喜欢的图片做背景将其保存,生成新的图片. 2.时间比较赶,主要是因为队员对于Android开发方面的了解不多,可以说是几乎没有,需要一步一步的 ...
- 启动 uiautomatorviewer 时报 SWT folder '..\lib\location of your Java installation.' does not exist.
现象,之前本机上的 uiautomatorviewer 一直是好的,最近这段时间无故就不行了,报如标题错误,网上找了各种办法仍无法有效解决,静心细想上一次使用该工具时到目前对本机有做什么跟系统或者工具 ...
- Android友盟推送
当前版本号:v3.0.5 1.下载SDK解压并导入(import module,compile project(':PushSDK')),里面有demo,用demo的包名去官网添加一个应用,然后替换d ...