设计模式--工厂模式

Posted Jqivin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--工厂模式相关的知识,希望对你有一定的参考价值。


工厂模式简单介绍

简单工厂模式如果新增加产品要修改工厂类代码,所以不符合开闭原则。如何实现增加新产品而不影响已有代码? – 使用工厂模式。
工厂模式为了解决简单工厂模式的缺点,为了实现开闭原则,工厂模式不是定义一个统一的工厂类来创建所有的产品。而是定义不同的工厂类来创建不同的产品。

定义:工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作
虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是
一种类创建型模式。

在工厂方法模式结构图中包含如下几个角色:

Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。

ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。

Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。

ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
在这里插入图片描述

代码:

//抽象产品类
class car
{
private:
public:
	car(){}
	virtual ~car(){}
	virtual void show() = 0;
};
//具体产品类
class Audi :public car
{
public:
	Audi() { cout << "construct Audi car " << endl; }
	~Audi(){ cout << "destory Audi car" << endl; }
	void show() { cout << "this is a Audi car" << endl; }
};
class Benz :public car
{
public:
	Benz() { cout << "construct Benz car " << endl; }
	~Benz() { cout << "destory Benz car" << endl; }
	void show() { cout << "this is a Benz car" << endl; }
};
//抽象工厂类
class carfactory
{
public:
	carfactory(){}
	virtual ~carfactory(){}
	virtual car* getcar() = 0;
};
//具体工厂类
class Audifactory :public carfactory
{
public:
	Audifactory(){}
	~Audifactory(){}
	car* getcar()
	{
		return new Audi();
	}
};
class Benzfactory :public carfactory
{
public:
	Benzfactory() {}
	~Benzfactory() {}
	car* getcar()
	{
		return new Benz();
	}
};

int main()
{
	unique_ptr<carfactory> af(new Audifactory);
	unique_ptr<car> ad (af->getcar());
	ad->show();

	unique_ptr<carfactory> bf(new Benzfactory);
	unique_ptr<car> bz(bf->getcar());
	bz->show();
	return 0;
}

结果
在这里插入图片描述

总结

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的不足。工厂方法模式是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式

1.优点

(1)解决了简单工厂模式的缺点。
(2)客户端不用关心产品是如何创建的,只提供参数就可以了
(3)在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

2.缺点

在添加新产品的时候,不仅要添加产品类,还要增加产品对应的工厂类,所以系统中的类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来额外的开销。

以上是关于设计模式--工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式---工厂模式