1、简单工厂模式
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同父类。因为在简单工厂模式中用于创建实例的方法是静态方法,所以简单工厂模式也可以称为静态工厂方法模式,是一种类创建型模式。
在简单工厂模式中,工厂类只生产一类产品,所有具体的产品的创建都集中于工厂类中,根据所传入参数的不同可以创建不同的产品对象。
简单工厂模式中的角色:
工厂角色:实现创建所有产品实例的内部逻辑;
抽象产品角色:工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法;
具体产品角色:每一个具体角色都继承了抽象产品的角色,需要实现抽象产品中声明的抽象方法。
2、工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化,它让一个类的实例化延迟到子类。它提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。它是基于工厂角色和产品角色的多态性而设计的。在系统中添加新产品时,无须修改抽象工厂类,只需添加一个新工厂类和新产品类就可以了。即工厂类可以生产多类产品。相应的产品由相对应的工厂来生产。
工厂方法模式中角色:
抽象产品:定义产品的接口,是产品对象的公共父类;
具体产品:实现了抽象产品接口,某种具体的产品由专门的具体工厂创建,即具体产品与具体工厂一一对应;
抽象工厂:声明了工厂方法,用于返回一个产品。所有创建对象的工厂类都必须实现该接口。
具体工厂:是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,返回的是一个具体产品类的实例。
3、抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。在它的抽象工厂类中,它声明了可以生产一族产品的方法,而每一个方法又对应一种产品。
抽象工厂模式中的角色:
抽象工厂:声明一组用于创建产品的方法,每一个方法对应一种产品;
具体工厂:实现在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族;
抽象产品:为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法;
具体产品:具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
三种的比较,例如
要创建几种不同的图形,即圆形、方形、三角形,可以使用简单工厂模式;
如果要创建很多种不同的图形,即圆形、方形、三角形、五角形等等,使用工厂方法模式;
如果要创建各种不同颜色不同形状的图形,这时就该使用抽象工厂模式了,可以把这几种的图形的共性抽象出来。
具体例子:
简单工厂:
class SingleCore//处理器,抽象产品
{
public:
SingleCore()
{
cout<<" Constructed SingleCore "<
class Factory//重点工厂方法类
{
public:
Factory()
{
cout<<" Constructed Factory "<
#include
using namespace std;
#include "Simple Factory.h"
int main()
{
int type;
cout<<"Input a type of SingleCore: ";
cin>>type;
if(type == 1 || type == 2)
{
Factory *factory = new Factory();
SingleCore *singlecore = factory->CreateSingleCore(type);
singlecore->show();
delete singlecore;
delete factory;
}
else
cout<<"no creating object"<
#ifndef COREFACTORY_H
#define COREFACTORY_H
#include
using namespace std;
#include "SingleCore.h"
#include "MultiCore.h"
class CoreFactory //生产处理器的工厂,抽象工厂
{
public:
CoreFactory()
{
cout<<" Construted CoreFactory "<
#ifndef SINGLECORE_H
#define SINGLECORE_H
#include
using namespace std;
class SingleCore//单核处理器,抽象产品
{
public:
SingleCore()
{
cout<<" Construted SingleCore "<
#include
using namespace std;
#include "CoreFactory.h"
int main()
{
int type;
cout<<" Input type of the product: ";
cin>>type;
switch( type )
{
case 1:
{
CoreFactory * FactoryA1 = new CoreFactoryA();//创建A型工厂
SingleCore * Singlecore1 = FactoryA1->CreateSingleCore();//生产A型单核处理器
cout<CreateSingleCore();//生产B型单核处理器
cout<
抽象工厂:
#ifndef ABSTRACT FACTORY_H
#define ABSTRACT FACTORY_H
#include
using namespace std;
#include "IDepartment.h"
#include "IUser.h"
class Factory//抽象工厂
//包括Access工厂和Department工厂
{
public:
Factory()
{
cout<<" Constructed Factory "<
#ifndef IDEPARTMENT_H
#define IDEPARTMENT_H
#include
using namespace std;
class IDepartment//部门抽象接口,抽象产品一
//部门包括Access部门和Sql部门
{
public:
IDepartment()
{
cout<<" Constructed IDepartment "<
#ifndef IUSER_H
#define IUSER_H
#include
using namespace std;
class IUser//用户抽象接口,用于产生不同的用户,抽象产品二
//它包括Access用户和Sql用户
{
public:
IUser()
{
cout<<" Constructed IUser "<
#include "Abstract Factory.h"
int main()
{
Factory* factory = new SqlFactory();//新建一个Sql工厂
IUser* user = factory->CreateUser();//创建Sql用户
IDepartment* depart = factory->CreateDepartment();//创建Sql部门
cout<GetUser();
depart->GetDepartment();
cout<