设计模式--工厂模式
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.缺点
在添加新产品的时候,不仅要添加产品类,还要增加产品对应的工厂类,所以系统中的类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来额外的开销。
以上是关于设计模式--工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )