工廠模式
定義:一個創建產品對象的工廠接口,將產品對象的實際創建工作推遲到具體子類工廠類中。
特點:(1)用戶只要知道具體工廠的名稱就可以得到所需要的產品,無需知道產品創建的過程。(2)增加新產品時只需要添加具體產品類和對應的具體工廠,無需修改源代碼,滿足開閉原則。
C++實現如下
Product.h
#pragma once
class AbstractProduct {
public:
AbstractProduct();
virtual ~AbstractProduct();
virtual void operation() = 0;
};
class ProductA :public AbstractProduct {
public:
ProductA();
~ProductA();
void operation();
};
class ProductB :public AbstractProduct {
public:
ProductB();
~ProductB();
void operation();
};
Product.cpp
#include"Product.h"
#include<iostream>
using namespace std;
AbstractProduct::AbstractProduct() {
cout << "AbstractProduct" << endl;
}
AbstractProduct::~AbstractProduct() {
cout << "~AbstractProduct" << endl;
}
ProductA::ProductA() {
cout << "ProductA" << endl;
}
ProductA::~ProductA() {
cout << "~ProductA" << endl;
}
void ProductA::operation() {
cout << "A operation" << endl;
}
ProductB::ProductB() {
cout << "ProductB" << endl;
}
ProductB::~ProductB() {
cout << "~ProductB" << endl;
}
void ProductB::operation() {
cout << "B operation" << endl;
}
Factory.h
#pragma once
#include"Product.h"
class AbstractFactory {
public:
AbstractFactory();
virtual ~AbstractFactory();
virtual AbstractProduct* createProduct() = 0;
};
class FactoryA :public AbstractFactory {
public:
FactoryA();
~FactoryA();
AbstractProduct* createProduct();
};
class FactoryB :public AbstractFactory {
public:
FactoryB();
~FactoryB();
AbstractProduct* createProduct();
};
Factory.cpp
#include"Factory.h"
#include"Product.h"
#include<iostream>
using namespace std;
AbstractFactory::AbstractFactory() {
cout << "AbstractFactory" << endl;
}
AbstractFactory::~AbstractFactory() {
cout << "~AbstractFactory" << endl;
}
FactoryA::FactoryA() {
cout << "FactoryA" << endl;
}
FactoryA::~FactoryA() {
cout << "~FactoryA" << endl;
}
AbstractProduct* FactoryA::createProduct() {
return new ProductA();
}
FactoryB::FactoryB() {
cout << "FactoryB" << endl;
}
FactoryB::~FactoryB() {
cout << "~FactoryB" << endl;
}
AbstractProduct* FactoryB::createProduct() {
return new ProductB();
}
main.cpp
#include"Factory.h"
int main(void) {
AbstractFactory* factortyA = new FactoryA();
AbstractProduct* productA = factortyA->createProduct();
AbstractFactory* factortyB = new FactoryB();
AbstractProduct* productB = factortyB->createProduct();
productA->operation();
productB->operation();
return 0;
}