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

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

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

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

时间: 2024-10-03 22:40:04

设计模式学习笔记--工厂方法模式的相关文章

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

1.特点:一般先用工厂方法解决对象创建问题. 2.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到子类. 3.类图: 4.程序实现: /// <summary> /// 抽象工厂,声明了一个创建Product的方法 /// </summary> public abstract class Creator { /// <summary> /// 该方法用来返回Product产品 /// </summary> /// &

设计模式学习(一)——工厂方法模式

这里抄一段维基百科的定义,工厂方法模式即:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 下图展示了一个工厂方法模式的结构图: 在上图中,展示了一个工厂方法模式的使用过程,消费者(类的使用者)要购买一个运动产品,他需要到该产品的生产厂家那里购买,生产厂家实现“运动产品”的生产.在这个过程中,消费者只需要特定功能的产品,而不管功能是如何实现的.工厂只需要生产指定产品,而不管产品是如何设计的.而产品类只需要提供产品功能的设计. 这与iphone

【大话设计模式读书笔记——工厂方法模式】

工厂方法模式 工厂方法模式的实质是"定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 工厂方法模式 VS 简单工厂模式 简单工厂的模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类.对于客户端来说,去除了与具体产品的依赖. 工厂方法模式,定义了一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到其子类.工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

设计模式C++实现——工厂方法模式

模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法. Creator的全部子类都必须实现工厂方法(factoryMethod()),以实际制造出产品. 全部的产品必须实现Product基类.这样一来使用这些产品的类就能够引用这个基类,而不是派生类. 举例: 披萨店希望可以开一些加盟店. 经营者希望确保加盟店运营的质量,所以希望这些店都使用能经过实践