【描述】工厂模式有3种类型:简单工厂,工厂方法,抽象工厂。这3种设计模式都属于创建型的设计模式。简单工厂的工厂是具象的,没有抽象的工厂类。工厂方法,定义了一个创建对象的接口,让子类来决定具体实例化哪一个类。抽象工厂模式面对的问题是多产品等级结构的系统设计。相对于简单工厂,工厂方法和抽象工厂都定义了抽象的工厂类。工厂方法与抽象工厂的区别在于:工厂方法的“工厂”只制造单一的“产品”,而抽象工厂可以制造一族“产品”。
1 简单工厂(Simple Factory)
【UML图】
图1 简单工厂
1 定义了一个具象的工厂Factory;
2 定义了一个抽象的产品Product以及两个具象的产品ProductA,ProductB,实现了产品的方法operation;
3 Factory将根据需要选择制造具象的产品。(注意是具象的产品,策略模式以及建造模式Client调用的是抽象的接口,这是工厂模式与策略模式、建造模式关键区别,下同)
【代码清单】
common.h
#ifndef COMMON_H
#define COMMON_H
enum {Product_A = 0, Product_B = 1};
#endif // COMMON_H
product.h
#ifndef PRODUCT_H
#define PRODUCT_H
class 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_H
class 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_H
class 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