c++设计模式-----抽象工厂模式

抽象工厂模式

    要创建一组相关或者相互依赖的对象

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

UML类图

抽象基类

1)AbstractProductA、AbstractProductB:分别代表两种不同类型的产品,由具体的产品派生类对其实现

2)AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现

说明:

AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中

Abstract Factory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象。其创建的实现其实采用的就是Factory模式的方法,对于某种实现,由一个派生出来的抽象工厂实现,对另一种实现,由另一个派生出来的抽象工厂实现。

  抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现。显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用

抽象工厂模式与工厂模式的区别

  AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中的实现。并且可以看到,AbstractFactory模式通常都是使用Factory模式实现(ConcreteFactory1)。

   工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

代码实现:

class AbstractProduct
{
protected:
  AbstractProduct(){}

public:
  void SharedThing()
  {  
        //实现产品的共性功能
    }
  virtual SomeThing() = 0;  //每个产品都有的功能,具体实现有差异
  virtual ~AbstractProduct()=0;
};

//两种不同的产品(抽象层)

class AbstactProductA:public AbstractProduct
{};

class AbstactProductB:public AbstractProduct
{};

//产品纵向分化,eg对于已经确定的中国人,日本人,又要区分男女了。

class ProductA1:public AbstractProductA
{};

class ProductA2:public AbstractProductA
{};

class ProductB1:public AbstractProductB
{};

class ProductB2:public AbstractProductB
{};

class AbstractFactory
{
protected:
  AbstractFactory(){}
public:
  virtual AbstractProductA* CreatProductA()=0;
  virtual AbstractProductB* CreatProductB()=0;

  virtual ~AbstractCreator()=0;
};

class ConcreteAbstractFactory1:public AbstractFactory
{
  AbstractProductA* CreatProductA()
  {
    return new ProductA1();
  }
  AbstractProductB* CreatProductB()
  {
    return new ProductB1();
  }
};

ConcreteAbstractFactory2:public AbstractFactory
{
  AbstractProductA* CreatProductA()
  {
    return new ProductA2();
  }
  AbstractProductB* CreatProductB()
  {
    return new ProductB2();
  }

}; 

应用

①优点:封装性;产品族内的约束为非公开状态:eg 产品分化的比例(专业内各班级人数平衡)这个问题对于客户是透明的,非公开的

②缺点:产品族扩展困难,每增加一个产品C,就必须在抽象类AbstractCreator中增加对应的方法,同时在每一个具体的工厂方法中加入对应代码,这违反了开闭原则。

使用场景

一个对象族(或一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

注意事项

提示:对于抽象工厂模式的缺点

扩展性差说的是产品族扩展困难而不是产品等级。

或者说横向容易,纵向难。

或者说产品末端结点扩展容易(1,2,3),中间难(ABC)

或者说抽象层的扩展难,具象层扩展容易(依赖倒置原则)

时间: 2024-08-05 15:29:26

c++设计模式-----抽象工厂模式的相关文章

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

5. 星际争霸之php设计模式--抽象工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248178.html============================================

JAVA设计模式--抽象工厂模式

抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般

Java设计模式——抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是属于创建型的设计模式,意在创造一个抽象的工厂,而后再由实例化出的具体的工厂来进行生产. 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品. 应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品).时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装.商务男装.时尚女装.时尚男装,这些也都是成套的,即一系列具体产品.假设一种情况(现实中是不存在的,要不然