工厂模式
参考链接:
简介
UML类图
简单工厂模式
#include <iostream>
using namespace std;
/* 摘抄自知乎
* 设计模式的一个重要原则就是:别改代码,只需要添代码
*/
/*
* 简单工厂
* 优点:简单
* 缺点:每增加一个类,都需要修改工厂类,违背了不改代码的原则
*/
//产品抽象类
class Product
{
public:
virtual void show() = 0;
virtual ~Product() {}
};
//产品A
class ProductA : public Product
{
public:
virtual void show(){cout << "ProductA" << endl;};
virtual ~ProductA() {}
};
//产品B
class ProductB : public Product
{
public:
virtual void show(){cout << "ProductB" << endl;};
virtual ~ProductB() {}
};
//工厂类
enum PRODUCT_TYPE {PRODUCT_A = 0, PRODUCT_B};
class Factory
{
public:
Product *create(PRODUCT_TYPE type) {
switch(type) {
case PRODUCT_A: return new ProductA; break;
case PRODUCT_B: return new ProductB; break;
default: return NULL; break;
}
}
};
int main()
{
Factory factoty;
Product *productA_ptr = factoty.create(PRODUCT_A);
productA_ptr->show();
delete productA_ptr;
Product *productB_ptr = factoty.create(PRODUCT_B);
productB_ptr->show();
delete productB_ptr;
return 0;
}
工厂方法模式
#include <iostream>
using namespace std;
/*
* 工厂方法
* 优点:遵循了不改代码的原则
* 缺点:一条生产线只能一个产品
*/
//产品抽象类
class Product
{
public:
virtual void show() = 0;
virtual ~Product() {};
};
//产品A
class ProductA : public Product
{
public:
virtual void show(){cout << "ProductA" << endl;}
virtual ~ProductA() {};
};
//产品B
class ProductB : public Product
{
public:
virtual void show(){cout << "ProductB" << endl;}
virtual ~ProductB() {};
};
//工厂抽象类
class Factory
{
public:
virtual Product *CreateProduct() = 0;
virtual ~Factory() {}
};
//产品A工厂
class FactoryProductA : Factory
{
public:
Product *CreateProduct() {return new ProductA();}
virtual ~FactoryProductA() {}
};
//产品B工厂
class FactoryProductB : Factory
{
public:
Product *CreateProduct() {return new ProductB();}
virtual ~FactoryProductB() {}
};
int main()
{
//开设工厂A
FactoryProductA factoryProductA;
//A产品由工厂A生产
Product *productA_ptr = factoryProductA.CreateProduct();
//A产品展示
productA_ptr->show();
delete productA_ptr;
FactoryProductB factoryProductB;
Product *productB_ptr = factoryProductB.CreateProduct();
productB_ptr->show();
delete productB_ptr;
return 0;
}
抽象工厂模式
#include <iostream>
using namespace std;
/*
* 抽象工厂
* 优点:遵循了不改代码的原则
* 缺点:增加一类,需要加很多个类,代码量比较大
*/
//A产品抽象类
class ProductA
{
public:
virtual void show() = 0;
virtual ~ProductA() {};
};
//A产品
class ProductA1 : public ProductA
{
public:
virtual void show(){cout << "ProductA" << endl;}
virtual ~ProductA1() {};
};
//B产品抽象类
class ProductB
{
public:
virtual void show() = 0;
virtual ~ProductB() {};
};
//B产品
class ProductB1 : public ProductB
{
public:
virtual void show(){cout << "ProductB" << endl;}
virtual ~ProductB1() {};
};
//工厂抽象类,可生产产品A和产品B
class Factory
{
public:
virtual ProductA *CreateProductA() = 0;
virtual ProductB *CreateProductB() = 0;
virtual ~Factory() {}
};
//生产AB产品的工厂
class FactoryProduct : Factory
{
public:
ProductA *CreateProductA() {return new ProductA1();}
ProductB *CreateProductB() {return new ProductB1();}
virtual ~FactoryProduct() {}
};
int main()
{
//开设工厂A
FactoryProduct factoryProduct;
//A产品由工厂A生产
ProductA *productA_ptr = factoryProduct.CreateProductA();
//A产品展示
productA_ptr->show();
delete productA_ptr;
ProductB *productB_ptr = factoryProduct.CreateProductB();
productB_ptr->show();
delete productB_ptr;
return 0;
}