Tsai笔记:C++设计模式学习(4)—— 工厂模式方法(Factory Method)

Tsai笔记:C++设计模式学习(4)—— 工厂方法模式(Factory Method)

设计模式的系列笔记链接如下:

Tsai笔记:C++设计模式学习(1)—— 设计模式介绍及分类

Tsai笔记:C++设计模式学习(2)—— 单例模式(Singleton)

Tsai笔记:C++设计模式学习(3)—— 享元模式(Flyweight)

Tsai笔记:C++设计模式学习(4)—— 工厂模式方法(Factory Method)

Tsai笔记:C++设计模式学习(5)—— 抽象工厂模式(Abstract Factory)

Tsai笔记:C++设计模式学习(6)—— 原型模式(ProtoType)

Tsai笔记:C++设计模式学习(7)—— 构建器(Builder)

一、模式定义

享元模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。                                                                                                    ——《设计模式》Gof

二、要点总结 

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

三、C++ 代码呈现

#include<iostream>

//抽象类(接口)
class ISplitter {
public:
	virtual ~ISplitter() {}
	virtual void split() = 0;
};

//具体类实现
class BinarySplitter : public ISplitter {
public:
	void split(){
		std::cout << " --- BinarySplitter Work !" << std::endl;
	}
};

class TxtSplitter : public ISplitter {
public:
	void split() {
		std::cout << " --- TxtSplitter Work !" << std::endl;
	}
};

class PictureSplitter : public ISplitter {
public:
	void split() {
		std::cout << " --- PictureSplitter Work !" << std::endl;
	}
};

class VideoSplitter : public ISplitter {
public:
	void split() {
		std::cout << " --- VideoSplitter Work !" << std::endl;
	}
};

//工厂基类
class SplitterFactory {
public:
	virtual ~SplitterFactory() {}
	virtual ISplitter* CreateSplitter() = 0;
};

//具体工厂类
class BinarySplitterFactory : public SplitterFactory {
public:
	ISplitter* CreateSplitter() {
		return new BinarySplitter;
	}
};

class TxtSplitterFactory : public SplitterFactory {
public:
	ISplitter* CreateSplitter() {
		return new TxtSplitter();
	}
};

class PictureSplitterFactory : public SplitterFactory {
public:
	ISplitter* CreateSplitter() {
		return new PictureSplitter();
	}
};

class VideoSplitterFactory : public SplitterFactory {
public:
	ISplitter* CreateSplitter() {
		return new VideoSplitter();
	}
};

class MainForm{
	SplitterFactory* factory;//工厂
public:
	MainForm(SplitterFactory* factory) {
		this->factory = factory;
	}

	void Work() {
		ISplitter * splitter = factory->CreateSplitter(); //多态new
		splitter->split();
	}
};

测试函数:

#include <Factory.h>
int main()
{
	BinarySplitterFactory binary;
	TxtSplitterFactory txt;
	PictureSplitterFactory picture;
	VideoSplitterFactory video;

	MainForm Splitter_b(&binary);
	Splitter_b.Work();

	MainForm Splitter_t(&txt);
	Splitter_t.Work();

	MainForm Splitter_p(&picture);
	Splitter_p.Work();

	MainForm Splitter_v(&video);
	Splitter_v.Work();

	return 0;
}

输出结果为:

 --- BinarySplitter Work !
 --- TxtSplitter Work !
 --- PictureSplitter Work !
 --- VideoSplitter Work !

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值