走进设计模式之——抽象工厂(Abstract Factory)

在走进抽象工厂之前,得先走进简单工厂。

一、简单工厂(Factory)模式

1. 概述

提供一个类,由它负责根据一定的条件创建某一具体类的实例。

2. 解决的问题

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式

3. 模式结构

Factory模式分为两种情况,分别如下图所示

图1 Factory模式结构示意图1

图1所以的Factory模式经常在系统开发中用到,但是这并不是Factory模式的最大威力所在(因为这可以通过其他方式解决这个问题)。Factory模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化(第二个问题),以下是这种情况的一个Factory的结构示意图:

图2 Factory模式结构示意图2

图2中关键中Factory模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory中只是提供了对象创建的接口,其实现将放在 Factory的子类ConcreteFactory中进行。这是图2和图1的区别所在。

 

模式中的角色

Product

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

ConcreteProduct

简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

Factory

声明生成一系列抽象产品的方法。

ConcreteFactory:

执行抽象产品的方法,生成不同的具体产品。

 

 

4.实现

给出一个实现的小例子。

 

classFactory
{
public:
         virtual ~Factory() = 0;
         virtual Product* CreatProduct() = 0;
 
protected:
         Factory();
 
private:
 
 
};
 
classConcreteFactory: public Factory
{
public:
         ~ConcreteFactory();
         ConcreteFactory();
         Product* CreatProduct();
 
protected:
 
private:
 
};
 
Factory::Factory()
{
 
}
Factory::~Factory()
{
 
}
ConcreteFactory::ConcreteFactory()
{
         cout<<"ConcreteFactory.."<<endl;
}
ConcreteFactory::~ConcreteFactory()
{
 
}
Product*ConcreteFactory::CreatProduct()
{
         return new ConcreteProduct();
}
 
classProduct
{
public:
         virtual ~Product() = 0;
 
protected:
         Product();
 
private:
 
 
};
 
class ConcreteProduct: public Product
{
public:
         ~ConcreteProduct();
         ConcreteProduct();
 
protected:
 
private:
 
};
 
Product::Product()
{
 
}
Product::~Product()
{
 
}
 
ConcreteProduct::ConcreteProduct()
{
         cout<<"ConcreteProduct..."<<endl;
}
 
ConcreteProduct::~ConcreteProduct()
{
 
}
 


 

二、抽象工厂(Abstract Factory)模式

提供创建对象的接口。与工厂方法类似,但此处返回的一系列相关产品。实现过程同样推延到子系列类去实现。与工厂方法的区别在于他们的层次模型。工厂方法的抽象基类只有儿子,而抽象工厂模式却是有孙子,而且每个儿子的儿子们之间有相互关联依赖关系。

1. 概述

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2. 解决的问题

  • 一个系统要独立于他的产品的创建、组合和表示时;
  • 一个系统要多个产品系统中的一个来配置时;
  • 当要强调一系列相关的产品对象的设计以便进行联合使用时;
  • 当提供一个产品类库,而只想显示他们的接口而不是实现时。

3. 模式结构

Abstract Factory典型模式如下图所示。

图3 AbstractFactory模式结构示意图

模式中的角色:

抽象工厂(Abstract Factory):

声明生成一系列抽象产品的方法

具体工厂(Concrete Factory):

执行生成一系列抽象产品的方法,生成一系列具体的产品

抽象产品(Abstract Product):

为这一系列的某一种产品声明接口

具体产品(Product):

定义具体工厂生成的具体产品的对象,实现产品接口

客户(Client):

我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。

 

4. 实现

给出一个实现的小例子。

产品类层次:

classAbstractProductA
{
public:
         virtual ~AbstractProductA();
protected:
         AbstractProductA();
private:
};
 
classAbstractProductB
{
public:
         virtual ~AbstractProductB();
protected:
         AbstractProductB();
private:
 
};
 
classProductA1: public AbstractProductA
{
public:
         ProductA1();
         ~ProductA1();
protected:
 
private:
 
};
 
classProductA2: public AbstractProductA
{
public:
         ProductA2();
         ~ProductA2();
};
 
classProductB1: public AbstractProductB
{
public:
         ProductB1();
         ~ProductB1();
};
 
classProductB2: public AbstractProductB
{
public:
         ProductB2();
         ~ProductB2();
};


 

抽象工厂类:

classAbstractProductA;
classAbstractProductB;
 
classAbstractFactory
{
public:
         virtual ~AbstractFactory();
         virtual AbstractProductA *CreateProductA() = 0;
         virtual AbstractProductB *CreateProductB() = 0;
protected:
         AbstractFactory();
 
};
 
classConcreteFactory1: public AbstractFactory
{
public:
         ConcreteFactory1();
         ~ConcreteFactory1();
         AbstractProductA * CreateProductA();
         AbstractProductB * CreateProductB();
        
};
 
classConcreteFactory2: public AbstractFactory
{
public:
         ConcreteFactory2();
         ~ConcreteFactory2();
         AbstractProductA * CreateProductA();
         AbstractProductB * CreateProductB();
        
};
 
AbstractProductA*ConcreteFactory1::CreateProductA()
{
         return new ProductA1();
}
AbstractProductB*ConcreteFactory1::CreateProductB()
{
         return new ProductB1();
}
 
AbstractProductA*ConcreteFactory2::CreateProductA()
{
         return new ProductA2();
}
AbstractProductB*ConcreteFactory2::CreateProductB()
{
         return new ProductB2();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值