设计模式 4/23 建造者模式

暂停了一周,因为种种缘由吧,外在的,内在的,各类致使了学习暂定了一周,连续学习真的是一件很难的事情。程序员

最近在换工做,从一家伟大的公司换到另一家伟大的公司,缘由只是不想再呆在外包,请原谅个人肤浅设计模式

不过,学习使我快乐ide

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

今天介绍 建造者模式ui

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

建造者模式:将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示设计

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

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

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便可

缺点

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

二、如内部变化复杂,会有不少的建造者类,增长了系统的复杂程度

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

相关文章
相关标签/搜索