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 !

 


版权声明:本文为weixin_43338642原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。