设计模式(8)-工厂模式(Factory)
【描述】工厂模式有3种类型:简单工厂,工厂方法,抽象工厂。这3种设计模式都属于创建型的设计模式。简单工厂的工厂是具象的,没有抽象的工厂类。工厂方法,定义了一个创建对象的接口,让子类来决定具体实例化哪一个类。抽象工厂模式面对的问题是多产品等级结构的系统设计。相对于简单工厂,工厂方法和抽象工厂都定义了抽象的工厂类。工厂方法与抽象工厂的区别在于:工厂方法的“工厂”只制造单一的“产品”,而抽象工厂可以制造一族“产品”。
1 简单工厂(Simple Factory)
【UML图】

图1 简单工厂
1 定义了一个具象的工厂Factory;
2 定义了一个抽象的产品Product以及两个具象的产品ProductA,ProductB,实现了产品的方法operation;
3 Factory将根据需要选择制造具象的产品。(注意是具象的产品,策略模式以及建造模式Client调用的是抽象的接口,这是工厂模式与策略模式、建造模式关键区别,下同)
【代码清单】
common.h
#ifndef COMMON_H#define COMMON_Henum {Product_A = 0, Product_B = 1};#endif // COMMON_Hproduct.h
#ifndef PRODUCT_H#define PRODUCT_Hclass Product{public: Product();public: virtual void operation();};#endif // PRODUCT_H
producta.h
#ifndef PRODUCTA_H#define PRODUCTA_H#include "product.h"class ProductA : public Product{public: ProductA();public: void operation();};#endif // PRODUCTA_H
productb.h
#ifndef PRODUCTB_H#define PRODUCTB_H#include "product.h"class ProductB : public Product{public: ProductB();public: void operation();};#endif // PRODUCTB_H
simplefactory.h
#ifndef SIMPLEFACTORY_H#define SIMPLEFACTORY_H#include "product.h"class SimpleFactory{public: SimpleFactory();public: Product* createProduct(int type);};#endif // SIMPLEFACTORY_H
product.cpp
#include <QDebug>#include "product.h"Product::Product(){ qDebug()<<"construct Product";}void Product::operation(){ qDebug()<<"Product operation";}
producta.cpp
#include <QDebug>#include "producta.h"ProductA::ProductA(){ qDebug()<<"construct ProductA";}void ProductA::operation(){ qDebug()<<"ProductA::operation";}
productb.cpp
#include <QDebug>#include "productb.h"ProductB::ProductB(){ qDebug()<<"construct ProductB";}void ProductB::operation(){ qDebug()<<"ProductA::operation";}
simplefactory.cpp
#include <QDebug>#include "common.h"#include "simplefactory.h"#include "producta.h"#include "productb.h"SimpleFactory::SimpleFactory(){}Product* SimpleFactory::createProduct(int type){ Product *p = NULL; switch(type) { case Product_A: p = new ProductA; break; case Product_B: p = new ProductB; break; default:; } return p;}
main.cpp
#include "simplefactory.h"#include "product.h"#include "common.h"int main(int argc, char **argv){ SimpleFactory *factory = new SimpleFactory; Product * product = factory->createProduct(Product_A); product->operation(); return 0;}【运行结果】
construct Product construct ProductA ProductA::operation
2 工厂方法(Factory Method)
【UML图】

图2 工厂方法
1 定义了一个抽象的工厂Factory以及两个具象的工厂,实现了产品制造的方法createProduct();
2 定义了一个抽象的产品Product以及两个具象的产品ProductA,ProductB,实现了产品的方法operation;
3 Factory将根据需要选择制造具象的产品。
【代码清单】
factory.h
#ifndef FACTORY_H#define FACTORY_H#include "product.h"class Factory{public: Factory();public: virtual Product *createProduct();};#endif // FACTORY_H
factorya.h
#ifndef FACTORYA_H#define FACTORYA_H#include "factory.h"#include "producta.h"class FactoryA : public Factory{public: FactoryA();public: ProductA *createProduct();};#endif // FACTORYA_H
factoryb.h
#ifndef FACTORYB_H#define FACTORYB_H#include "factory.h"#include "productb.h"class FactoryB : public Factory{public: FactoryB();public: ProductB *createProduct();};#endif // FACTORYB_H
product.h
#ifndef PRODUCT_H#define PRODUCT_Hclass Product{public: Product();public: virtual void operation();};#endif // PRODUCT_H
producta.h
#ifndef PRODUCTA_H#define PRODUCTA_H#include "product.h"class ProductA : public Product{public: ProductA();public: void operation();};#endif // PRODUCTA_H
productb.h
#ifndef PRODUCTB_H#define PRODUCTB_H#include "product.h"class ProductB : public Product{public: ProductB();public: void operation();};#endif // PRODUCTB_H
factory.cpp
#include <QDebug>#include "factory.h"Factory::Factory(){ qDebug()<<"construct Factory";}Product *Factory::createProduct(){ return new Product;}
factorya.cpp
#include <QDebug>#include "factorya.h"FactoryA::FactoryA(){ qDebug()<<"construct FactoryA";}ProductA *FactoryA::createProduct(){ return new ProductA;}
factoryb.cpp
#include <QDebug>#include "factoryb.h"FactoryB::FactoryB(){ qDebug()<<"construct FactoryB";}ProductB* FactoryB::createProduct(){ return new ProductB;}
product.cpp
#include <QDebug>#include "product.h"Product::Product(){ qDebug()<<"construct Product";}void Product::operation(){ qDebug()<<"Product Operation";}
producta.cpp
#include <QDebug>#include "producta.h"ProductA::ProductA(){ qDebug()<<"construct ProductA";}void ProductA::operation(){ qDebug()<<"ProductA operation";}
productb.cpp
#include <QDebug>#include "productb.h"ProductB::ProductB(){ qDebug()<<"construct ProductB";}void ProductB::operation(){ qDebug()<<"ProductB operation";}
main.cpp
#include "factory.h"#include "factorya.h"#include "factoryb.h"#include "product.h"int main(int argc, char **argv){ Factory *factory = new FactoryA; Product *product = factory->createProduct(); product->operation(); return 0;}
【运行结果】
construct Factory construct FactoryA construct Product construct ProductA ProductA operation
3 抽象工厂(Abstract Factory)
【UML图】

图3 抽象工厂
1 定义了一个抽象的工厂Factory以及两个具象的工厂,实现了产品制造的方法createProductA(),createProductB;
2 定义了一个抽象的产品Product以及两个具象的产品ProductA,ProductB,实现了产品的方法operationA,operationB;
3 Factory将根据需要选择制造一族具象的产品。
【代码清单】
factory.h
#ifndef FACTORY_H#define FACTORY_H#include "product.h"class Factory{public: Factory();public: virtual Product *createProductA(); virtual Product *createProductB();};#endif // FACTORY_H
factorya.h
#ifndef FACTORYA_H#define FACTORYA_H#include "factory.h"#include "producta.h"#include "productb.h"class FactoryA : public Factory{public: FactoryA();public: ProductA *createProductA(); ProductB *createProductB();};#endif // FACTORYA_H
factoryb.h
#ifndef FACTORYB_H#define FACTORYB_H#include "factory.h"#include "producta.h"#include "productb.h"class FactoryB : public Factory{public: FactoryB();public: ProductA *createProductA(); ProductB *createProductB();};#endif // FACTORYB_H
product.h
#ifndef PRODUCT_H#define PRODUCT_Hclass Product{public: Product();public: virtual void operationA(); virtual void operationB();};#endif // PRODUCT_H
producta.h
#ifndef PRODUCTA_H#define PRODUCTA_H#include "product.h"class ProductA : public Product{public: ProductA();public: void operationA();};#endif // PRODUCTA_H
productb.h
#ifndef PRODUCTB_H#define PRODUCTB_H#include "product.h"class ProductB : public Product{public: ProductB();public: void operationB();};#endif // PRODUCTB_H
factory.cpp
#include <QDebug>#include "factory.h"Factory::Factory(){ qDebug()<<"construct Factory";}Product *Factory::createProductA(){ return new Product;}Product *Factory::createProductB(){ return new Product;}
factorya.cpp
#include <QDebug>#include "factorya.h"FactoryA::FactoryA(){ qDebug()<<"construct FactoryA";}ProductA *FactoryA::createProductA(){ return new ProductA;}ProductB *FactoryA::createProductB(){ return new ProductB;}
factoryb.cpp
#include <QDebug>#include "factoryb.h"FactoryB::FactoryB(){ qDebug()<<"construct FactoryB";}ProductA *FactoryB::createProductA(){ return new ProductA;}ProductB *FactoryB::createProductB(){ return new ProductB;}
product.cpp
#include <QDebug>#include "product.h"Product::Product(){ qDebug()<<"construct Product";}void Product::operationA(){ qDebug()<<"Product OperationA";}void Product::operationB(){ qDebug()<<"Product OperationB";}
producta.cpp
#include <QDebug>#include "producta.h"ProductA::ProductA(){ qDebug()<<"construct ProductA";}void ProductA::operationA(){ qDebug()<<"ProductA operation";}
productb.cpp
#include <QDebug>#include "productb.h"ProductB::ProductB(){ qDebug()<<"construct ProductB";}void ProductB::operationB(){ qDebug()<<"ProductB operation";}
main.cpp
#include "factory.h"#include "factorya.h"#include "factoryb.h"#include "product.h"int main(int argc, char **argv){ Factory *factory = new FactoryA; Product *product = factory->createProductA(); product->operationA(); product = factory->createProductB(); product->operationB(); return 0;}
【运行结果】
construct Factory construct FactoryA construct Product construct ProductA ProductA operation construct Product construct ProductB ProductB operation
【资源下载】
1 Qt设计模式1-8测试源码:http://download.csdn.net/detail/tandesir/4984275
*之所以发到第8篇博文,才放代码,是希望大家能动手实践。如利用VC平台实现设计模式。如果只是照搬,没有什么意义的。代码可能存在错误,设计模式理解可能也有偏差,恳请指正。
声明:该源码仅供学习交流,勿用于商业目的。
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.csdn.net/tandesir