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. jQuery手机端触摸卡片切换效果

    效果:http://hovertree.com/code/run/jquery/a1gr3gm9.html 可以用手机查看效果. 代码如下: <!doctype html> <htm ...

  2. CSS :first-child 选择器 和 HTML DOM firstChild 属性

    CSS 选择器参考手册 实例 选择属于其父元素的首个子元素的每个 <p> 元素,并为其设置样式: p:first-child { background-color:yellow; } 亲自 ...

  3. 利用CSS3D效果制作简易旋转木马效果

    最近看一下css3d的一些特性,想着也实验学习一下,制作个小demo之类的.就练习了一下.开发一个粗糙的选择木马效果,如图 其实就是找到角度和位置,计算每根柱子的旋转角度摆放到3d空间的置顶位置即可. ...

  4. iOS之There was an internal API error错误

    There was an internal API error. 错误原因:把Product Name作为程序名称,程序名称错乱 解决方法:检查Product Name, 不要包含中文以及特殊字符.在 ...

  5. iOS之UI--富文本总结

    文章内容大纲 1.NSMutableAttributedString的基本使用 2.NSMutableAttributedString的简易封装 3.使用开源代码GOBMarkupPaser处理富文本 ...

  6. iOS证书和描述文件

    iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试 发布(Distribution ...

  7. HTML5-01 简介

    标记语言 概述 标记语言(也称置标语言),是一种将文本及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机编码.与文本相关的其他信息(包括例如文本的结构和表示信息等)与原来的文本结合 ...

  8. python之很好的网站

    1.python官方开发者文档查询和python下载网站 2.

  9. 配置git同时push到两个远端库的简单方法

    最近在写一个开源的论坛系统,在发布代码时选择了github和coding这两个平台,我手懒,不想敲两次git push了,所以说突然有了一个很奇怪的需求:用一条git push同时push到两个远端代 ...

  10. Linux备份ifcfg-eth0文件导致的网络故障问题

    今天在给一台操作系统为Oracle Linux Server release 5.7的服务器配置网络时,遇到了备份ifcfg-eth0配置文件,导致网卡无法绑定IP地址的情况.觉得是个有意思的案例,特 ...