当前位置:  编程技术>.net/c#/asp.net

C# 设计模式之Abstract Factory 抽象工厂(概念)

    来源: 互联网  发布时间:2014-08-30

    本文导语:  Abstract Factory 抽象工厂(创建型模式) 一,new的问题  ① 创建型模式主要解决的就是一个new的问题      常规的对象创建方法 Road road = new Road();  ② new的问题 模式设计很多是由于new的方式引起的,     而抽象工厂要讨论...

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

一,new的问题
 ① 创建型模式主要解决的就是一个new的问题
     常规的对象创建方法 Road road = new Road();

 ② new的问题 模式设计很多是由于new的方式引起的,
    而抽象工厂要讨论的问题就是,常规的方式依赖于new,不能应对“具体实例化类型”的变化
  
 ③ 对应的解决思路:
       封装变化点 -> 那里变化,那里封装(如果没有变化,当然不需要封装)
  
 ※封装变化点,设计模式很多就是要解决变化点的封装,找到变化点,并进行封装

二,工厂模式的缘起
 
 ① 既然变化点在于“对象创建”,因此就封装“对象创建”面向接口编程,可以实现依赖于接口,而非依赖于实现。
 来看一个简单的方法。
 

代码示例:

 class Road { }

    class RoadFactory
    {
        public static Road CreateRoad() { return new Road(); }
    }     

    class Program
    {
        static void Main(string[] args)
        {
            RoadFactory roadFactory = new RoadFactory();
            Road road = RoadFactory.CreateRoad();
        }
    }
 

   
    ②
 当我们想改变 return new Road();的内容的时候只需要在RoadFactory工厂类中进行改变
    比如我们想new 一个新的道路类型,比如泥路,水路,航路,绿化过的路等等各种类型
    假设一个新类型WaterRoad水路  就要改成return new WaterRoad();
    再隐身如果需要创造更多类型的时候,就需要应对更为复杂的变化
  
    比如我们可以这样改变RoadFactory
 

代码示例:

 class Road { }
    class Building { } //建筑
    class Tunnel { }   //地道
    class Jungle { }   //丛林

    class RoadFactory
    {
        public static Road CreateRoad() { return new Road(); }
        public static Building CreateBuilding() { return new Building(); }
        public static Tunnel CreateTunnel() { return new Tunnel(); }
        public static Jungle CreateJungle() { return new Jungle(); }
    } 
  
 class Program
    {
        static void Main(string[] args)
        {
            Road road = RoadFactory.CreateRoad();
            Building building = RoadFactory.CreateBuilding();
        }
    }
 

 ③问题:  
 用静态方法的方式实现工厂类,那么还是会有存在变化点的问题,程序相对来说不是稳定的
 不能应对不同系列的变化,又不能为每一个系列创建工厂,比如BuildingFactory,TunnelFactory等,
  
三,创建工厂模式的动机
① 在软件系统中,经常面临“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,“往往存在更多系列对象的创建工作”。
比如不同风格的道路,地道,丛林等等... ...
  
② 问题 如果绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合。
    ※“”部分是重点  
③ 意图:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类。----《设计模式》GoF

四,该模式使用的注意事项
① 如果没有应对多系列对象构建的需求变化,则没有必要使用抽象工厂。简单的静态工厂完全可以。
(如果是稳定的几个类型,只是风格(系列)发生变化的话,那么就是适用于抽象工厂模式)
② 系列对象 指的是这些对象之间又相互依赖关系,或作用的关系,例如:游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖
③ 抽象工厂模式主要在于应对 有“新系列”的需求变动,其缺点在于难以应对“新对象”的需求变动
④ 抽象工厂模式经常和Factory Method(工厂方法)模式共同组合来应对“对象创建”的需求变化。

就是这些了,希望有助于大家理解C#抽象工厂模式的相关概念,祝大家学习进步。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • GOF设计模式简介- 责任链模式
  • 起个贴子,大家伙来归纳一下Java本身设计中的设计模式
  • 各位,市面上有什么设计模式的书么
  • 大家可以探讨一下Servlet的设计模式么?
  • linux网络编程(UDP多播)如何实现Observer设计模式?
  • 讨论facade设计模式。
  • 哪里有《设计模式》中文电子版书
  • 设计模式怎么放到Java类里面???
  • 设计模式是怎样产生的?
  • 请问什么是“设计模式”,有这方面的教材吗?望各位大侠指点指点初学者。谢谢!
  • 在EJB中如何应用设计模式?
  • Java设计模式之适配器模式简介
  • 【一周话题】请大家介绍一下关于设计模式的实际应用例子
  • C++设计模式类库 Loki
  • 谁有《设计模式》中文电子书?
  • 谁有设计模式的例子例子?
  • Java设计模式之创建者模式简介
  • 如何实现非电子商务的设计模式(不要web层)
  • 谁有Design Patterns Explained (设计模式精解)这本书的电子版?谢谢!!
  • 求设计模式 电子书 高分
  • Java设计模式之中介者模式(Mediator Pattern)简介


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3