zoukankan      html  css  js  c++  java
  • 设计模式 4/23 建造者模式

    暂停了一周,由于种种原因吧,外在的,内在的,各种导致了学习暂定了一周,连续学习真的是一件很难的事情。

    最近在换工作,从一家伟大的公司换到另外一家伟大的公司,原因只是不想再呆在外包,请原谅我的肤浅

    不过,学习使我快乐

    设计模式,不要迷信,也不要轻信,但不可不知道,现在众所周知的23种设计模式只是对前人们的进行一个总结,不是说只有这23种,切记

    今天介绍 建造者模式

    建造者,Builder,拥有上帝视角,绝不出错

    建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    敲黑板了,注意看,3个点

    1.处理的是一个复杂对象,简单对象就没有必要用此模式了,每次模式的运用,都是类结构的复杂化过程,注意权衡得失利弊

    2.构建与表示分离,分离是为了更好的相遇

    3.同样的过程,不同的表示,就是经历相同的过程,能产生不一样的对象,就好像128G和256G的苹果手机,装配过程完全相同,但却是不同的型号的手机(此未考证,纯属为了举例而举例)

    复杂,分离,相同

    三个词,我们举个例子,细细品味下

    法式大餐,堪称西餐之首,程序复杂,过程繁多

    法国大餐至少有五道,你带着你女朋友准备去浪漫一回【程序员怎么会有女朋友,这是个bug】,第一次到了法式餐厅,你得点餐吧,你不会直接去后厨告诉大厨,你要羊扒陪香槟加咖啡吧,你也不知道法式大餐有5道菜啊,而且你发现,服务员特别推荐他们今天的2种套餐,我们姑且称为Alpha法式大餐和Beta法式大餐。于是你就想,要不来个A餐吧,于是服务员知道你要A餐,点餐完毕,就等上菜了

    基于以上,我们来看看代码怎么实现,代码即生活啊

    首先我们有一个法式大餐的类,这个类规定,我们法式大餐至少5道

         /// <summary>
        /// 法式大餐
        /// </summary>
        public abstract class FrenchDinner
        {
            /// <summary>
            /// 开胃酒
            /// </summary>
            public abstract void Aperitif();
    
            /// <summary>
            /// 前菜
            /// </summary>
            public abstract void Appetizer();
    
            /// <summary>
            /// 主菜
            /// </summary>
            public abstract void MainCourse();
    
            /// <summary>
            /// (餐后)甜点
            /// </summary>
            public abstract void Dessert();
    
            /// <summary>
            /// 咖啡
            /// </summary>
            public abstract void Coffee();
        }
    View Code

    那今天餐厅特别推荐 Alpha法式大餐 和 Beta法式大餐

        /// <summary>
        /// Alpha法式大餐
        /// </summary>
        public class AlphaFrenchDinner : FrenchDinner
        {
            public AlphaFrenchDinner()
            {
                Console.WriteLine("这是 Alpha 法式大餐");
            }
    
            /// <summary>
            /// 开胃酒
            /// </summary>
            public override void Aperitif()
            {
                Console.WriteLine("开胃酒:红葡萄酒");
            }
    
            /// <summary>
            /// 前菜
            /// </summary>
            public override void Appetizer()
            {
                Console.WriteLine("前菜:沙拉");
            }
    
            /// <summary>
            /// 主菜
            /// </summary>
            public override void MainCourse()
            {
                Console.WriteLine("主菜:牛排");
            }
    
            /// <summary>
            /// (餐后)甜点
            /// </summary>
            public override void Dessert()
            {
                Console.WriteLine("甜点:蛋奶酥");
            }
    
            /// <summary>
            /// 咖啡
            /// </summary>
            public override void Coffee()
            {
                Console.WriteLine("咖啡:卡布奇诺");
            }
        }
    
    
        /// <summary>
        /// Beta法式大餐
        /// </summary>
        public class BetaFrenchDinner : FrenchDinner
        {
            public BetaFrenchDinner()
            {
                Console.WriteLine("这是Beta 法式大餐");
            }
    
            /// <summary>
            /// 开胃酒
            /// </summary>
            public override void Aperitif()
            {
                Console.WriteLine("开胃酒:香槟");
            }
    
            /// <summary>
            /// 前菜
            /// </summary>
            public override void Appetizer()
            {
                Console.WriteLine("前菜:海鲜");
            }
    
            /// <summary>
            /// 主菜
            /// </summary>
            public override void MainCourse()
            {
                Console.WriteLine("主菜:羊扒");
            }
    
            /// <summary>
            /// (餐后)甜点
            /// </summary>
            public override void Dessert()
            {
                Console.WriteLine("甜点:慕斯");
            }
    
            /// <summary>
            /// 咖啡
            /// </summary>
            public override void Coffee()
            {
                Console.WriteLine("咖啡:红茶");
            }
        }
    View Code

    那你不能自己去告诉后厨说你要A餐吧,这个时候有个服务员,这个就是我们建造者模式中最重要的角色

        /// <summary>
        /// 
        /// </summary>
        public class FrenchDirector
        {
            public FrenchDirector(FrenchDinner frenchDinner)
            {
                _frenchDinner = frenchDinner;
            }
    
            private FrenchDinner _frenchDinner;
    
            /// <summary>
            /// build法式大餐
            /// </summary>
            public void CreateFrenchDinner()
            {
                _frenchDinner.Aperitif();
                _frenchDinner.Appetizer();
                _frenchDinner.MainCourse();
                _frenchDinner.Dessert();
                _frenchDinner.Coffee();
            }
        }
    View Code

    那轮到你上场了,也就是我们怎么调用了

      static void Main()
            {
                var director = new FrenchDirector(new BetaFrenchDinner());//请帮我点个B餐
                director.CreateFrenchDinner();
                Console.ReadLine();
            }
    View Code

    最后的输出是

    “这是Beta 法式大餐”
    “开胃酒:香槟”
    “前菜:海鲜”
    “主菜:羊扒”
    “甜点:慕斯”
    “咖啡:红茶”

    总结下

    优点

    1.显而易见,复杂的对象被轻松创建,并且不会少一步也不会多一步

    2.如果还有C餐,D餐,我们只需要继续增加相关类即可

    3.如果法式大餐要在家吃,需要跳过开胃酒,直接进入主菜和甜品,那我们只需要再多创建一个建造者类FrenchDirector即可

    缺点

    1、对象必须有共同点,范围受到限制,比如我想增加一道程序,则我们需要修改的每一个继承者

    2、如内部变化复杂,会有很多的建造者类,增加了系统的复杂程度

    以上就是关于 建造者模式 的分享,来的晚些,但不会缺席

  • 相关阅读:
    docker安装
    linux磁盘空间挂载
    python之MD5加密
    python之pymysql
    python 之Redis笔记
    python 随机生成中文名字
    python之json笔记
    python时间模块笔记
    python 用pip安装pymysql(win7下)
    数据库操作番外篇~
  • 原文地址:https://www.cnblogs.com/LionelMessi/p/7513490.html
Copyright © 2011-2022 走看看