2.       抽象工厂模式(Abstract Factory

Ø         动机(Motivation)

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

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

Ø         意图(Intent)

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

Ø         结构(Structure)
 

Ø         示例代码

游戏开发中的多风格系列场景,比如道路,房屋,管道等

    //道路

    public abstract class Road

    {

    }

    //房屋

    public abstract class Building

    {

    }

    //地道

    public abstract class Tunnel

    {

    }

    //丛林

    public abstract class Jungle

    {

    }

     public abstract class FacilitiesFactory

     {

        public abstract Road CreateRoad();

        public abstract Building CreateBuilding();

        public abstract Tunnel CreateTunnel();

        public abstract Jungle CreateJungle();

     }

    //现代风格道路

    public class ModernRoad : Road

    {

    }

    //现代风格房屋

    public class ModernBuilding : Building

    {

    }

    //现代风格地道

    public class ModernTunnel : Tunnel

    {

    }

    //现代风格丛林

    public class ModernJungle : Jungle

    {

    }

    //现代风格场景

    public abstract class ModernFacilitiesFactory : FacilitiesFactory

    {

        public override Road CreateRoad()

        {

            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 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(road);

            tunnel.ccc();

            jungle.ddd(tunnel);

        }

    }

    class App

    {

        public static void Main()

        {

            GameManager g = new GameManager(new ModernFacilitiesFactory());

            g.BuildGameFacilities();

            g.Run();

        }

    }