zoukankan      html  css  js  c++  java
  • 35、面向对象设计模式之抽象工厂(Abstract Factory)设计模式

    new的问题:

      常规的对一个象创建方法:

      // 创建一个Road对象

      Road road = new Road();

    new的问题:

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

    解决思路:

      -封装变化点——哪里变化,封装哪里

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

    工厂模式的缘起

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

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

    简单工厂的问题:

      不能应对“不同系列对象“的变化,比如有不同风格的游戏场景--对应不同风格的道路、房屋、地道。

    如何解决:

      使用面向对象的技术来封装变化点。

    动机:

      在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作,同时由于需求的变化,往往存在更多系列对象的创建工作。

      如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作的“的紧耦合?

    意图:

      提供一个接口,让该接口负责创建一系列”相关或者相互依赖的对象“,无需指定它们具体的类。

    结构图

      

     示例代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 抽象工厂模式
    {
        //道路
        public abstract class Road
        {
    
        }
        //房屋
        public abstract class Building 
        {
        
        }
        //地道
        public abstract class Tunnel
        { 
        }
        //从林
        public abstract class Jungle
        { 
        }
    
        //道路
        public  class ModernRoad:Road
        {
    
        }
        //房屋
        public  class ModernBuilding:Building
        {
    
        }
        //地道
        public  class ModernTunnel:Tunnel
        {
        }
        //从林
        public  class ModernJungle:Jungle
        {
        }
        public abstract class FacilitiesFactory
        {
            public abstract Road CreateRoad();
            public abstract Building CreateBuilding();
    
            public abstract Tunnel CreateTunnel();
    
            public abstract Jungle CreateJungle();
        }
        public class ModernFacilitiesFactory : FacilitiesFactory
        {
            public override Building CreateBuilding()
            {
                return new ModernBuilding();
            }
    
            public override Jungle CreateJungle()
            {
                return new ModernJungle();;
            }
    
            public override Road CreateRoad()
            {
               return new ModernRoad();
            }
    
            public override Tunnel CreateTunnel()
            {
                return new ModernTunnel();
            }
        }
        //客户程序
        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() { 
            
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
                GameManager gameManager = new GameManager(new ModernFacilitiesFactory());
                gameManager.Run();
            }
        }
    }

    Abstract Factory 模式的几个要点:

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

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

      Abstract Factory模式主要在于应对”新系列“的需求变动。其缺点在于难以应对”新对象“的需求的变动。

      Abstract Factory 经常和Factory Method模式共同组合来应对“对象创建的要求变化。

    推荐参考书

      《设计模式:可复用面向对象软件的基础》GoF

      《面向对象分析与设计》Grady Booch

      《敏捷软件开发:原则、模式、与实践》Robert C.Martin

      《重构:改善既有代码的设计》Martin Fowler

      《Refactoring to Patterns》Joshua Kerievsky

  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/sy-liu/p/13166475.html
Copyright © 2011-2022 走看看