//---------------------------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的更多相关文章

  1. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

  2. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  3. C#设计模式-2工厂方法模式(Factory Method)

    什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买.但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往 ...

  4. 23种设计模式之工厂方法(Factory Method Pattern)

    工厂方法 前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例.在同一等级结构中,支持增加任意产品这种设 ...

  5. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  6. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  7. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  8. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  9. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

随机推荐

  1. 转:.NET面试题汇总(三)

    原文地址:http://www.cnblogs.com/yuan-jun/p/6600692.html 1.简述 private. protected. public. internal 修饰符的访问 ...

  2. [Python_4] Python 面向对象(OOP)

    0. 说明 Python 面向对象(OOP) 笔记.迭代磁盘文件.析构函数.内置方法.多重继承.异常处理 参考 Python面向对象 1. 面向对象 # -*-coding:utf-8-*- &quo ...

  3. Linux下源码编译安装MySQL 5.5.8

    准备工作: 新建用户和用户组 groupadd mysql useradd -g mysql mysql 1:下载: bison-2.4.2.tar.bz2 cmake-2.8.3.tar.gz ma ...

  4. bootstrap模态框input不能获取焦点并编辑【转】

    Bootstrap模态框时input标签[日期控件也有这样的问题]不能编辑的问题,下面是我的解决方法: 1.将下图中框出来的属性删掉即可: 2.兼容火狐浏览器,笔者在火狐中还是不能编辑,去掉下图属性即 ...

  5. SDOI 2018 R2 游记

    一篇真正的“游记”. DAY -3 下午: 今天老师批准了我去省选划水的请假要求. 批准之后感觉学习非常有动力,顺便忽悠别的同学和我一起去,然而wzx是唯一一个表示可以考虑一下的同学,其他同学直接一口 ...

  6. BZOJ3998:[TJOI2015]弦论(SAM)

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  7. javascript实现百度地图鼠标滑动事件显示、隐藏

    其实现思路是给label设置样式,我们来看下具体做法吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var label = new BMap.Labe ...

  8. mysql主从复制亲测,以及注意事项

    本人亲测,windows作为mysql主服务器,linux作为从服务器,使用两个linux配置步骤都一样,测一遍而已:区别配置文件在于windwos是my.ini.linux在/etc/my.cof ...

  9. pyspider爬取数据存入mysql--2.测试数据库能否连通

    做一个简单的测试,看数据能否存入mysql 1 #!/usr/bin/env python 2 # -*- encoding: utf-8 -*- 3 # Created on 2017-10-26 ...

  10. Python基础(11)——反射、异常处理

    1.反射 以下均是对对象的操作,而不是对类 class Foo(object): def __init__(self): self.name = 'wupeiqi' def func(self): r ...