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

解决"系列对象"的需求变化
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();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值