码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习笔记--工厂方法模式

时间:2015-06-08 09:52:05      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:设计模式   工厂模式   扩展   开放      


学习过简单工厂模式,感觉很好用。在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码。大大的减少了代码修改的难度。而且可以通过参数不同,创建不同的对象。


但是简单工厂模式也有一些弊端,违背了开放--封闭原则。即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展。所以就有了下面的工厂方法模式:


工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类。


// 设计模式Demo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

//被创建的对象基类动物类
class Animal
{
public:
	virtual void func() = 0;
};

//子类 鸟
class Bird : public Animal
{
public:
	void func()override
	{
		cout<<"I am a bird. I can fly!"<<endl;
	}
};


//子类 人
class Human : public Animal
{
public:
	void func()override
	{
		cout<<"I am a human. I can walk!"<<endl;
	}
};

//工厂基类
class FactoryMethod
{
public:
	virtual Animal* Create() = 0;
};

//人类工厂
class HumanFactory : public FactoryMethod
{
public:
	Animal* Create()override
	{
		return new Human();
	}
};

//鸟类工厂
class BirdFactory : public FactoryMethod
{
public:
	Animal* Create()override
	{
		return new Bird();
	}
};






int _tmain(int argc, _TCHAR* argv[])
{
	//创建一个人类工厂
	FactoryMethod* god = new HumanFactory();
	//生成人类对象,并执行操作
	god->Create()->func();

	//创建一个鸟类工厂
	god = new BirdFactory();
	//生成鸟类对象,并执行操作
	god->Create()->func();

	getchar();

	return 0;
}<strong>
</strong>

结果:

I am a human. I can walk!
I am a bird. I can fly!


使用工厂方法模式时,我们定义工厂方法时,只要定义一个接口或者抽象类,子类继承该接口或者抽象类,具体实现都由子类实现。而且不像简单工厂模式那样,需要在工厂中增加判断条件,在这里,添加子类的生产方法,只需要从接口或者抽象类再派生一个相关的子工厂类。遵循开放--封闭式原则。


设计模式学习笔记--工厂方法模式

标签:设计模式   工厂模式   扩展   开放      

原文地址:http://blog.csdn.net/puppet_master/article/details/46404547

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!