在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度。
根据《设计模式——可复用面向对象软件的基础》所说:“你必须找到相关的对象,以适当的颗粒度将他们回归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。”
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用的解决方案。这些重复的模式方案解决特定的问题,使得面向对象的设计更灵活、优雅,最终复用性更好。它们帮助设计者将新的设计建立在以往的工作基础上,复用以往的成功设计方案。一个熟悉这些设计模式的设计者不需要再去发现它们,而能够立即将他们应用于设计问题中。
本系列文章主要参考文献为——设计模式,可复用面向对象软件的基础(Design Patterns Elements of Reusable Object-Oriented SoftWare Erich.),内部代码基本用C++语言编写。
汇总链接:23种设计模式C++实现——概要(索引汇总)
摘要
工厂模式主要分为三类,1、简单工厂模式;2、工厂方法模式;3、抽象工厂模式,通常大家会将1,2放在一起,因为这两种相对第3种会简单一些,头两种均是包含创建特定对象的单一接口,让子类去决定实例化哪一个类。但是抽象工厂模式不同,他是创建一系列相关或相互依赖对象的接口,并且不需要指定他们具体的类。
可能看了上边的摘要还是不太懂,看下边的具体实例讲解。
1、简单工厂模式
简单工厂是由一个抽象产品类和一个具体工厂类实现的;
【例图】
/****************************************************************
Author : BingLee
Date : 2019-03-05
Info :
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
//抽象产品类
#include <stdio.h>
#include <string>
class BMW
{
public:
virtual void GetCar() = 0;
};
//具体产品1
class BMW320 : public BMW
{
public:
BMW320(){}
void GetCar(){printf("BMW320 \n");}
};
//具体产品2
class BMW520 : public BMW
{
public:
BMW520(){}
void GetCar(){printf("BMW520 \n");}
};
//具体工厂类
class SimpleFactory
{
public:
SimpleFactory(){}
BMW *CreatCar(std::string name){
if(name == "BMW320")
return new BMW320();
else if(name == "BMW520")
return new BMW520();
else
return NULL;
}
};
//客户类
#include <QCoreApplication>
#include "simplefactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SimpleFactory bmwFactory;
BMW *carA = bmwFactory.CreatCar("BMW320");
BMW *carB = bmwFactory.CreatCar("BMW520");
carA->GetCar();
carB->GetCar();
return a.exec();
}
/*理论输出
BMW320
BMW520
*/
1、工厂方法模式
工厂方法由一个抽象产品类和一个抽象工厂组成,具体如下
【例图】
/****************************************************************
Author : BingLee
Date : 2019-03-05
Info :
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include <stdio.h>
#include <string>
//抽象产品类
class BMW
{
public:
virtual void GetCar() = 0;
};
//具体产品1
class BMW320 : public BMW
{
public:
BMW320(){}
void GetCar(){printf("BMW320 \n");}
};
//具体产品2
class BMW520 : public BMW
{
public:
BMW520(){}
void GetCar(){printf("BMW520 \n");}
};
//工厂方法与简单工厂由基本相同的产品,区别在于抽象非具体的工厂
//抽象工厂类
class Factory
{
public:
virtual BMW *CreatCar() = 0;
};
//具体工厂1
class BMW320Factory : public Factory
{
public:
BMW *CreatCar()
{
return new BMW320();
}
};
//具体工厂2
class BMW520Factory : public Factory
{
public:
BMW *CreatCar()
{
return new BMW520();
}
};
//客户端
#include <QCoreApplication>
#include "simplefactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Factory *factory1 = new BMW320Factory();
Factory *factory2 = new BMW520Factory();
BMW *car1 = factory1->CreatCar();
BMW *car2 = factory2->CreatCar();
car1->GetCar();
car2->GetCar();
return a.exec();
}
/*理论输出
BMW320
BMW520
*/
- 当一个类不知道它所必须创建的对象类的时候;
- 当一个类希望由他的子类来指定他所创建的对象的时候;
- 当类将创建对象的职责委托给多个帮助子类中的某一个时,并且希望将哪一个帮助子类是代理者这一信息局部化的时候;
简单工厂属于最基本的工厂方法,试用工厂方法模式使用情况第1条,其余按情况选择是用工厂方法模式或是抽象工厂模式。
本篇博客中的代码均已通过编译,如有Bug,请提出宝贵意见~