目录
概念UML图实现优缺点
概念
创建型模式关注对象的创建过程,在软件开发中应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象过程中无须关心对象的创建细节,从而降低系统耦合度,并且让系统易于修改和扩展。
简单工厂模式是最简单的设计模式之一,同时也是其余创建模式的基础。定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
例如,有个生产球类运动器材的工厂。客户A下了一批单说要购买1万个篮球,客户B要购买5千个足球,工厂需要根据用户的不同需求生产相应的球给客户。篮球和足球都是球,它们是相似产品。
简单工厂基本实现流程
由上述例子,可以很容易总结出简单工厂的实现流程:
设计一个抽象产品类Product,它包含一些公共方法的实现;
从抽象产品类中派生出多个具体产品类ConcreteProduct,如篮球类、足球类、排球类,具体产品类中实现具体产品生产的相关代码;
设计一个工厂类Factory,工厂类中提供一个生产各种产品的工厂方法,该方法根据传入参数(产品名称)创建不同的具体产品类对象;
客户只需调用工厂类的工厂方法,并传入具体产品参数,即可得到一个具体产品对象。
UML图
这个示例里头,定义了一个运算基类,派生出具体的加减乘除子类;简单工厂类提供了一个生产函数createOperate(),通过给它传入"+、-、*、/"来构建具体的加减乘除类。
实现
#include <iostream>
using namespace std;
//抽象基类
class Product
{
public:
void virtual MethodDiff() = 0; //声明抽象业务方法
Product(const string &name):m_name(name)
{
}
virtual ~Product() //声明为虚析构
{
cout<<"product "<<m_name<<" destroy"<<endl;
}
protected:
string m_name;
};
class ConcreteProductA : public Product
{
public:
ConcreteProductA(const string &name):Product(name)
{
}
void MethodDiff()
{
cout<<"I am ConcreteProductA"<<endl;
}
};
class ConcreteProductB : public Product
{
public:
ConcreteProductB(const string &name) : Product(name)
{
}
void MethodDiff()
{
cout<<"I am ConcreteProductB"<<endl;
}
};
class Factory
{
public:
Product *CreateProduct(const string &name)
{
Product *product = NULL;
if(name == "A")
product = new ConcreteProductA(name);
else if(name == "B")product = new ConcreteProductB(name);
return product;
}
};
int main()
{
Factory factory;
Product *product;
product = factory.CreateProduct("A"); //工厂类创建对象
product->MethodDiff();
delete product;
product = factory.CreateProduct("B"); //工厂类创建对象
product->MethodDiff();
delete product;
}
优缺点
【优点】:客户端创建对象时只需要调用工厂类提供的创建方法,传入特定参数即可,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)
【缺点】:实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。每次新增一个产品,就要创建一个新的产品类,以及修改工厂类的创建逻辑。
【应用场景】:适合业务简单或者产品较少的情况。




