工厂设计
模式?工厂设计
模式可解决什么问题?先看一下示例
,多态
示例.
#include
using namespace std;
class Shape {
public:
Shape() { }
virtual void drawShape()
{
cout << "base draw shape" << endl;
}
};
class Rectangular : public Shape {
public:
Rectangular(){ }
void drawShape ()
{
cout << "draw rectangular" << endl;
}
};
class Triangular : public Shape {
public:
Triangular () { }
void drawShape ()
{
cout << "draw triangular" << endl;
}
};
class Circle : public Shape {
public:
Circle(){ }
void drawShape ()
{
cout << "draw circle" << endl;
}
};
int main()
{
Shape *rect = new Rectangular();
rect->drawShape();
delete rect;
Shape *tri = new Triangular();
tri->drawShape();
delete tri;
Shape *cir = new Circle();
cir->drawShape();
delete cir;
/*这里添加许多形状...*/
return 0;
}
上述代码示例很简单,想带多态,绘画矩形,三角形,圆等
.思考一个问题:如果还要画菱形,椭圆
等等.很容易出现N多
子类继承基本Shape
,main()
中的会大量的new XXXX
,导致很难维护和扩展
代码.
这就是工厂对象
设计模式解决的问题之一.
还有,基类
并不知道具体
要实例化哪一个具体
的子类,具体
实例化要延迟
到继承类
中.
工厂创建产品. 产品==>多子产品.
工厂设计
模式结构图,该模式下,工厂基类
知道如何实例化
具体产品
工厂=>具体工厂(创建产品)方法
产品(操作)=>具体产品(操作).
工厂设计
模式结构图,延迟
到子类中具体实例化对象
方法
基本要素:
(1)
抽象产品Product
;
(2)
具体产品ConcreteProduct;
(3)
抽象工厂Factory
.
(4)
具体的工厂ConcreteFactory
下面直接给出代码示例:
头文件
#include
using namespace std;
class Computer {
public:
Computer();
virtual ~Computer() = 0;
private:
};
class DellComputer: public Computer {
public:
~DellComputer();
DellComputer();
private:
};
class AppleComputer : public Computer {
public:
AppleComputer();
~AppleComputer();
};
class Factory {
public:
Factory();
virtual ~Factory() = 0;
virtual Computer *CreateComputer(const string &type) = 0;//
private:
//串类型;
};
class ConcreateFactory: public Factory {
public:
~ConcreateFactory();
ConcreateFactory();
Computer *CreateComputer(const string &type);
};
//main.cpp
#include "product.h"
#include
using namespace std;
Computer::Computer()
{
cout << "Computer()" << endl;
}
Computer::~Computer()
{
cout << "~Computer()" << endl;
}
DellComputer::DellComputer()
{
cout << "DellComputer()" << endl;
}
DellComputer::~DellComputer()
{
cout << "~DellComputer()" << endl;
}
AppleComputer::AppleComputer()
{
cout << "AppleComputer()" << endl;
}
AppleComputer::~AppleComputer()
{
cout << "~AppleComputer()" << endl;
}
Factory::Factory()
{
cout << "Factory()" << endl;
}
Factory::~Factory()
{
cout << "~Factory()" << endl;
}
ConcreateFactory::ConcreateFactory()
{
cout << "ConcreateFactory()" << endl;
}
ConcreateFactory::~ConcreateFactory()
{
cout << "~ConcreateFactory()" << endl;
}
Computer *ConcreateFactory::CreateComputer(const string &type)
{
if (type == "dell")
return new DellComputer();
else if (type == "apple")
return new AppleComputer();
else
throw invalid_argument("Invalid argument");
}
int main()
{
Factory *fac = new ConcreateFactory();
Computer *dell = fac->CreateComputer("dell"); //制造`dell`电脑
delete dell;
Computer *apple = fac->CreateComputer("apple"); //制造苹果电脑
delete apple;
delete fac;
return 0;
}
使用工厂类
的好处是,可在工厂
类中封装
创建对象的逻辑,使代码更模块化和清晰
.同时,工厂类
可按需
选择创建不同
产品对象,客户代码
只需与抽象产品
类交互,而不需要了解具体
产品类.
这样代码
更灵活,且更容易扩展和修改
.
工厂模式
仅局限于某一个类
,有时候需要为一组相关或依赖
的对象提供配套的接口
.此时就需要抽象工厂模式
了,其实抽象工厂模式
跟工厂模式
是一回事.
抽象工厂(创建A,创建B)
=>多个具体工厂(创建A,创建B)
抽象产品A=>具体A1,具体A2
抽象产品B=>具体B1,具体B2
抽象工厂
设计模式结构图,抽象工厂
设计模式就是工厂模式
的扩展版.
假如要为生成
的电脑装操作系统,假如Dell--->windows
系统,Apple----->IOS
系统,再来一个华为
电脑,需要装鸿蒙
系统等.
头文件
#include
using namespace std;
class Computer {
public:
Computer();
virtual ~Computer() = 0;
private:
};
class DellComputer: public Computer {
public:
~DellComputer();
DellComputer();
private:
};
class OS {
public:
OS();
virtual ~OS() = 0;
};
class WindowsOS : public OS {
public:
WindowsOS();
~WindowsOS();
};
class Factory {
public:
Factory();
virtual ~Factory() = 0;
virtual Computer *CreateComputer() = 0;
virtual OS *CreateOS() = 0;
private:
//串类型;
};
class ConcreateFactory: public Factory {
public:
~ConcreateFactory();
ConcreateFactory();
Computer *CreateComputer();
OS *CreateOS();
};
//main.cpp
#include "product.h"
#include
using namespace std;
Computer::Computer()
{
cout << "Computer()" << endl;
}
Computer::~Computer()
{
cout << "~Computer()" << endl;
}
DellComputer::DellComputer()
{
cout << "DellComputer()" << endl;
}
DellComputer::~DellComputer()
{
cout << "~DellComputer()" << endl;
}
OS::OS()
{
cout << "OS()" << endl;
}
OS::~OS()
{
cout << "~OS()" << endl;
}
WindowsOS::WindowsOS()
{
cout << "WindowsOS()" << endl;
}
WindowsOS::~WindowsOS()
{
cout << "~WindowsOS()" << endl;
}
Factory::Factory()
{
cout << "Factory()" << endl;
}
Factory::~Factory()
{
cout << "~Factory()" << endl;
}
ConcreateFactory::ConcreateFactory()
{
cout << "ConcreateFactory()" << endl;
}
ConcreateFactory::~ConcreateFactory()
{
cout << "~ConcreateFactory()" << endl;
}
Computer *ConcreateFactory::CreateComputer()
{
return new DellComputer();
}
OS *ConcreateFactory::CreateOS()
{
return new WindowsOS();
}
int main()
{
Factory *fac = new ConcreateFactory();
Computer *dell = fac->CreateComputer();
OS *os = fac->CreateOS();
delete dell;
delete os;
delete fac;
return 0;
}