Abstract Factory 抽象工厂模式(创建型模式):

new的问题:实现依赖,不能应变应对“具体实例化类型”的变化。

解决思路:--封装变化点:哪里变化,封装哪里           -

-潜台词:如果没有变化,当然不需要额外的封装

工厂模式的缘起

变化点在“对象创建”,因此就封装“对象创建”

面向接口的编程——依赖接口,而非依赖实现

简单工厂的问题     --不能应对“不同系列对象”的变化。比如有不同风格的游戏场景——对应不同风格的道路,房屋,地道。。。。

——如何解决:使用面向对象的技术来“封装”变化点

抽象工厂模式

动机(Motivation):在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

意图(Intent):提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类《设计模式》GOF

实现代码

public abstract class Road//道路

{ }

public abstract class Building//房屋

{ }

public abstract class Tunnel//地道

{ }

public abstract class Jungle//丛林

{ }

abstract class FacilitiesFactory

{   

public abstract Road CreateRode();   

public abstract Building CreateBuilding();   

public abstract Tunnel CreateTunnel();   

public abstract Jungle CreateJungle();

}

//客户程序

class GameManager

{   

FacilitiesFactory  facilitiesFactory;    

Road road;   

Building building;   

Tunnel tunnel;   

Jungle jungle;   

public GameManager(FacilitiesFactory  facilitiesFactory)

 {        

this.facilitiesFactory=facilitiesFactory;  

}    

public void BuildGameFacilities()

 {     

    road=facilitiesFactory.CreateRoad();     

   building=facilitiesFactory.CreateBuilding();   

   tunnel=facilitiesFactory.CreateTunnel();     

    jungle=facilitiesFactory.CreateJungle();  

}    

  public void Run()  

  {      

      road.Aaa();      

     building.Bbb();  

  }

}

//现代的风格

public class ModernRoad:Road//道路

{ }

public  class ModernBuilding:Building//房屋

{ }

public  class ModernTunnel:Tunnel//地道

{ }

public  class ModernJungle:Jungle//丛林

{ }

//具体的实现

public class ModernFacilitiesFactory:FacilitiesFactory

{     

public override Road CreateRode()  

{     

return new ModernRoad();  

}     

public override Building CreateBuilding()  

{    

  return new ModernBuilding();  

}

public override Tunnel CreateTunnel()  

{     

return new ModernTunnel();  

}

   public override Jungle CreateJungle()  

{     

return new ModernJungle();

  }

}

class APP

{   

GameManager g=new (new ModernFacilitiesFactory());   

g.BuildGameFacilities();   

g.Run();

}

Abstract Factory模式的几个要点:

——如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工       厂完全可以。

——“系列对象”指的是这些对象之间有相互依赖,或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖

——Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动 ——Abstract Factory模式经常和Factor Method模式共同组合来应对“对象创建”的需求变化

设计模式——抽象工厂(Abstract Factory)的更多相关文章

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

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...

  2. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  3. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  4. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  5. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  6. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...

  7. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  8. C2:抽象工厂 Abstract Factory

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...

  9. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  10. Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)

    Dough.h #ifndef _DOUGH_H #define _DOUGH_H class Dough { }; #endif ThinCrustDough.h #ifndef _THIN_CRU ...

随机推荐

  1. 【UI插件】开发一个简单日历插件(上)

    前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...

  2. [deviceone开发]-一个固定列,可以上下左右滑动的表格示例

    一.简介 一个类型table的例子,第一列和第二列可以固定,剩下的后面的很多列都可以左右滑动,也可以上下滑动,这种需求一般是为了展示多列表格数据.这个例子是通过二大部分: 左边是一个普通的listvi ...

  3. css相对定位和绝对定位

    相对定位,是对原来元素的位置为参照物进行定位: 绝对定位,如果父级没有定位,则针对HTML为参照物进行定位:如果父级有定位,则针对父元素为参照物进行定位

  4. jQuery初探 jQuery选取和操纵元素的特点

    jQuery初探 jQuery选取和操纵元素的特点 JavaScript选取元素 先来看看不用jQuery的时候我们是怎么处理元素选取的. JavaScript选取元素的时候,可以根据id获取元素,当 ...

  5. addEventListener和attachEvent的区别

    addEventListener共有3个参数,如下所示:element.addEventListener(type,listener,useCapture); 参数 参数说明 element 要绑定事 ...

  6. Mac使用极简教程

    最近领导让我写一篇关于Mac的使用教程,因为使用人群未知,所以尽量写的通俗易懂,可谓是关于Mac电脑使用的精简教程吧,在此发表出来以供参考. Mac因为安全性而闻名,我们拥有了一部Mac,那么我们来了 ...

  7. 在 CentOS7 上安装 MySQL5.7

    在 CentOS7 上安装 MySQL5.7 1 通过 SecureCRT 连接到阿里云 CentOS7 服务器: 2 进入到目录 /usr/local/ 中: cd /usr/local/ 3 创建 ...

  8. ionic day01教程第一天之多平台运行(ios & android)

    一.创建项目 创建项目 ionic start myApp 运行项目 (1)通过浏览器运行项目 进入项目,后运行ionic serve cd myApp ionic serve 浏览器运行效果 二.多 ...

  9. 解决PKIX:unable to find valid certification path to requested target 的问题

    这两天在twitter服务器上忽然遇到这样的异常: e: sun.security.validator.ValidatorException: PKIX path building failed: s ...

  10. [C#6] 7-索引初始化器

    0. 目录 C#6 新增特性目录 1. 老版本的代码 private static void Main() { var dictionary = new Dictionary<int, stri ...