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


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


但是简单工厂模式也有一些弊端,违背了开放--封闭原则。即如果我们增加了一个产品,对应的工厂也要进行修改,即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!


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


如果在客户端,直接使用Animal指针接受Factory创建的对象,更加能够体现出工厂方法模式的优势。由于多态,Animal调用方法为工厂所创建的对象的方法,预先并不知道会创建出哪种对象,即使原本没有这种对象,新增加了一个对象,也仅仅是添加一个类并写一个相关的工厂,在创建工厂的时候,创建一个相应的工厂即可创建新的对象,这样大大的增加了可维护性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值