23种设计模式-Abstract Factory(抽象工厂)设计模式

来源:互联网 发布:vmware ubuntu 安装 编辑:程序博客网 时间:2024/05/29 15:04
解决"系列对象"的需求变化
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//依赖于抽象namespace _抽象工厂设计模式{   //  注意:设计一个程序需要仔细观察变化的轴线在哪里,然后进行进一步封装.    /*1.如果没有应对"多系列对象构建"的需求变化,那就没有必要使用        Abstract Factory模式,这时候使用简单的静态工厂完全可以.           2."系列对象"指的是这些对象之间有相互依赖,或者作用的关系,例如游戏开发         场景中的"道路"与"房屋"的依赖.           3.Abstract Factory模式主要应对与"新系列"的需求变动,其缺点在于难与应对        "新对象"的需求变动,比如下面程序,我现在要添加一种"地道"对象,修改起来        会非常麻烦!所以在设计之前一定要观察,它变化的轴线在哪里,这很重要..            4.Abstract Factory模式经常和Factory Method模式共同组合来应对"对象创建"        的需求变化.    */    //==================抽象===============================    //道路    public abstract class Road {      //可以写一些抽象方法        public abstract void LeiXing();    }    //房屋    public abstract class Building {        //可以写一些抽象方法        public abstract void LeiXing();    }    //抽象工厂    public abstract class FacilitiesFactory {        public abstract Road CreateRoad();        public abstract Building CreateBuilding();    }    //=======================================================    //=================具体实现==============================    //实现1----------------------------------------    public class XianDaiRoad:Road{             public override void LeiXing()        {            Console.WriteLine("现代街道");        }    }    public class XianDaiBuilding : Building    {        public override void LeiXing()        {            Console.WriteLine("现代房屋");        }    }    //--------------------------------------------------------实现1结尾    //实现2----------------------------------------    public class GuDianRoad : Road    {        public override void LeiXing()        {            Console.WriteLine("古典街道");        }    }    public class GuDianBuilding : Building    {        public override void LeiXing()        {            Console.WriteLine("古典房屋");        }    }    //--------------------------------------------------------实现2结尾    //实现3----------------------------------------    public class ZhanZhengRoad : Road    {        public override void LeiXing()        {            Console.WriteLine("战争街道");        }    }    public class ZhanZhengBuilding : Building    {        public override void LeiXing()        {            Console.WriteLine("战争房屋");        }    }    //--------------------------------------------------------实现3结尾    //具体工厂---------------------------------    public class GongChang: FacilitiesFactory {        public override Road CreateRoad()        {            //修改的时候只需要修改这里就可以了,            //return啥就是啥类型的街道/            return new ZhanZhengRoad();        }        public override Building CreateBuilding()        {            //return啥就是啥类型的房屋            return new ZhanZhengBuilding();        }    }    //-------------------------------------------------------------    //客户类---相对就稳定了,无论前面怎么修改这里都不太会有影响    class GameManager {        FacilitiesFactory facilities;        Road road;        Building building;                public GameManager(FacilitiesFactory _facilities) {            this.facilities = _facilities;        }        //这里根本不需要变动,在编程中这里如果有变动的话会很麻烦        public void BuildGameFacilities() {             road = facilities.CreateRoad();             building = facilities.CreateBuilding();           }        //执行,实例后的方法        public void Run() {            road.LeiXing();            building.LeiXing();        }    }    class Program    {        static void Main(string[] args)        {            GongChang gc = new GongChang();            GameManager g = new GameManager(gc);            g.BuildGameFacilities();            g.Run();            Console.ReadKey();        }    }}

1 0