首页 > 其他分享 >原来建造者模式是这样用的

原来建造者模式是这样用的

时间:2023-02-21 09:22:59浏览次数:23  
标签:Computer void 建造 AddPart 模式 computer 原来 public

概述

面临一个复杂对象的创建工作,通常由各个部分的子对象用一定的算法构成。
子部件(对象)比较多,对象不能当作一个完整的对象或者产品使用(邮件:发件人,收件人、抄送人、主题、邮件内容)
子部件需要按照一定的顺序赋值才有一定的意义,在某个子部件没有赋值之前,另一个子部件就无法赋值。

类图

注:该类图来源网上

需求

用组装电脑来说明,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。

未使用建造者模式的代码

  /// <summary>
    /// 产品类
    /// </summary>
    public class Computer
    {
        private List<string> _servers = new List<string>();
        public void AddPart(string part)
        { 
        _servers.Add(part);
        }
        public void ShowComputer()
        {
            foreach (var item in _servers)
            {
                Console.WriteLine($"正在安装{item}");
            }
        }
    }
//C#控制台调用
Computer computer = new Computer();
computer.AddPart("i5的cpu");
computer.AddPart("256G的硬盘");
computer.AddPart("32G的内存");
computer.AddPart("17寸的显示器");
computer.AddPart("win7的操作系统");
computer.ShowComputer();

以上就是组装电脑的代码,如果是个人组装一台,那这么玩某种程度上是可以的;对于公司而言,要采购一批电脑,这么玩效率就太低下了,采购员不可能挨个买零件回来自己组装。反正总的来说,浪费时间和精力,所有内容全部需要客户搞定,而且创建对象和客户端强耦合。

使用建造者模式的代码

 public interface IBuilderComputer
    {
        //1 封装创建各个部件的过程

        void BuildCpu();
        void BuildDisk();
        void BuildMemory();
        void BuildScreen();
        void BuildSystem();
        //2、将创建好的复杂对象返回
        Computer GetComputer();

    }
 public class MyDirectory
    {
        public void BuildComputer(IBuilderComputer builderComputer)
        {
            builderComputer.BuildCpu();
            builderComputer.BuildDisk();
            builderComputer.BuildMemory();
            builderComputer.BuildScreen();
            builderComputer.BuildSystem();
        }
    }
 /// <summary>
    /// 具体建造者一
    /// </summary>
    public class GoodComputer : IBuilderComputer
    {
        private Computer _computer=new Computer();
        public void BuildCpu()
        {
            _computer.AddPart("i7的cpu");
        }

        public void BuildDisk()
        {
            _computer.AddPart("2T的固态硬盘");
        }

        public void BuildMemory()
        {
            _computer.AddPart("32G的内存");
        }

        public void BuildScreen()
        {
            _computer.AddPart("32寸的显示屏的内存");
        }

        public void BuildSystem()
        {
            _computer.AddPart("win10的操作系统");
        }

        public Computer GetComputer()
        {
           return _computer;    
        }
    }
    /// <summary>
    /// 具体建造者二
    /// </summary>
    public class BadComputer : IBuilderComputer
    {
        private Computer _computer = new Computer();
        public void BuildCpu()
        {
            _computer.AddPart("i3的cpu");
        }

        public void BuildDisk()
        {
            _computer.AddPart("126的机械硬盘");
        }

        public void BuildMemory()
        {
            _computer.AddPart("2G的内存");
        }

        public void BuildScreen()
        {
            _computer.AddPart("14寸的显示屏的内存");
        }

        public void BuildSystem()
        {
            _computer.AddPart("win7的操作系统");
        }

        public Computer GetComputer()
        {
            return _computer;
        }
    }
    /// <summary>
    /// 产品类
    /// </summary>
    public class Computer
    {
        private List<string> _servers = new List<string>();
        public void AddPart(string part)
        { 
        _servers.Add(part);
        }
        public void ShowComputer()
        {
            foreach (var item in _servers)
            {
                Console.WriteLine($"正在安装{item}");
            }
        }
    }
//C#控制台调用
Console.WriteLine("建造者设计模式正式登场");
IBuilderComputer b1=new GoodComputer();
IBuilderComputer b2 = new BadComputer();
MyDirectory directory = new MyDirectory();
directory.BuildComputer(b1);
 var goodComputer= b1.GetComputer();
goodComputer.ShowComputer(); 

directory.BuildComputer(b2);    
var badComputer=  b2.GetComputer();
badComputer.ShowComputer(); 

以上是使用建造者模式实现采购电脑的代码,现在仅仅是采购了2台,如果采购10台,那就很简单了。

建造者模式比较简单,其实像上面的类图已经说得很明确,abstractBuilder(抽象建造者)、ConcreteBuilder(具体建造者)、product(具体产品)、 Director(指挥者),只要掌握好这4个之间的关系,实现起来照猫画虎。

有人问建造者模式与工厂模式有什么区别?

1、建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。

2、创建对象的力度不同,建造者创建复杂的对象,由各路复杂的部件组成,工厂模式创建出的对象都一样。

3、关注点不同,工厂模式只需要把对象创建出来就可以,而建造者不仅要创建出这个对象,还要知道这个对象由哪些部件组成。

4、建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样

总结

不知道大家用得建造者模式多不多,有人说他还没用过,其实像我们的.NetCore里面就有大量的建造者模式的使用,可以在梳理dotnetcore源码时多留意体会一下。有何疑问,欢迎交流。

标签:Computer,void,建造,AddPart,模式,computer,原来,public
From: https://www.cnblogs.com/mhg215/p/17138377.html

相关文章

  • 生产者和消费者模式
    生产者消费者模式(简易版)synchronize中的wait和notifyAll实现synchronize:当一个线程进入到同步代码块时,会获取到当前的锁,而这时如果其他使用同样的锁的同步代......
  • CSS文本,字体设置与元素显示模式
    什么是元素的显示模式网页中的标签很多,在不同的地方使用不同类型的标签。元素显示模式就是标签以什么方式进行显示。如:div自己占一行,span一行可以放多个。HTML元素一般......
  • spark-3.3.2-bin-hadoop3-scala2.13 Local模式
    目标搭建单机开发环境,执行pyspark程序安装Anaconda3-2022.10-Linux-x86_64.sh安装pycharm-community-2022.3.2.tar.gz 环境OS:Ubuntu22基础包安......
  • 高级程序员解决问题的思维模式
    「NLP理解层次」将对一件事的理解,由低到高分为6个不同的层次,即维度。低维角度无法解决的问题,站在更高的维度理解,就会称为一个非常简单的问题,我愿称之为「降维打击」。接下来......
  • KVM虚拟化之磁盘:磁盘缓存模式
     虚拟化一般网络和存储都是难点。下图所示,磁盘I/O从虚拟机到宿主物理机存储的过程。其中虚拟机镜像并不是必须的。并不一定要给虚拟机创建虚拟磁盘文件。我们可以通过逻......
  • redis集群模式
    以前的redis要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis、twemproxy,有一些redis中间件,你读写redis中间件,redis中间件负责将你的数据分布......
  • 华为云API Arts:用“1+1+5”的模式,为你带来API-First体验
    摘要:华为云APIArts是API全生命周期一体化协作平台,支持开发者一站式高效实现API设计、API开发、API测试、API托管、API运维、API变现,助力企业数字化转型。本文分享自华为......
  • 什么是前后端分离开发模式?
    随着数字化管理越来越规范化,低代码开发平台也获得了市场的喜爱。在信息化爆炸式发展的当下,不少低代码开发者也看到了前后端分离开发模式带来的优势特点,于是纷纷加入研发阵......
  • CSS架构之BEM设计模式
    为什么需要CSS架构?其实在日常开发CSS当中,会遇到许多的问题,使用设计模式能够很好的解决。例如在日常开发项目,需要组件化时,组件内部的class样式类管理就非常的杂乱。大部分公......
  • 项目一众筹网03_5_工作模式探讨同步和异步探讨
    系列文章目录文章目录​​系列文章目录​​​​22-Ajax工作模式探讨-异步​​​​23-Ajax工作模式探讨-同步​​​​24-Ajax工作模型探讨-总结​​一般我们开发的程序都是......