设计模式 笔记 工厂方法 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
0;

}

//        子类可以这么重定义:

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即可。

时间: 2025-01-09 19:42:41

设计模式 笔记 工厂方法 Factory Methon的相关文章

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

设计模式二: 工厂方法(Factory Method) 简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个工厂, 这样的好处是当有新产品引入时可以不修改具体的工厂角色. 意图 定义了一个创建对象的接口,但由子类决定要实例化哪个类.工厂方法把实例化操作推迟到子类. 类图 实现 以汽车举例. 按照本模式核心的四个角色分别定义, 并增加模式调用角色(此处

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,

每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式 1.模式定义 定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类. 2.工厂方法模式解决问题的思路 工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法):可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了:这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了. 3.实际问题 实现一个导出数据的功能,客户选择数据的导出格式

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

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

【设计模式】——工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使用一个类的实例化延迟到其子类.根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法.然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂.我们在要增加新的功能,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了.这样整个工厂和产品系其实都没有修改的

设计模式一 工厂模式Factory

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便

【大话设计模式】—— 工厂方法模式

一.概念 想象一下我们的寻常见到的工厂,下一个订单,付了订金,一段时间后就能够提货.我们不须要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,只须要一个订单就好,工厂就能够依照其固定流水线做出我们所须要的产品.设计模式中也有类似的一个大神:工厂方法模式. 以下让我们来认识一下: 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.UML图 Product(抽象产品) ConcreteProduct(

设计模式之工厂方法

设计模式之工厂方法 当在项目开发阶段,要开发易扩展易维护的代码,工厂方法就能解决很大部分这个问题. 我们来举例说明, 比如公司有个A类库,我们开发项目很多地方需要调用A类, 如果不使用设计模式,那么每个用到A类的地方,我们都要 去new一个实例出来,那么当项目突然有一天,要把A类换成 B类,维护人员去改时才发现,要改的地方太多了,不小心一点就 可能影响到整个系统的功能. 那么我们使用工厂方法哪? 我们只需要创建一个工厂方法, 然后方法里new 一个实例,那么我们在项目开发里 用到A类时, 使用工

【转载】设计模式_工厂方法(学习)

定义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 上面右半部分是产品抽象和实现体系,左半部分是工厂抽象和实现体系,其中工厂体系依赖于产品体系,每一个工厂负责创造一种产品,这就省去了简单工厂中的elseif判断,由客户端决定实例化一个特定的工