设计模式(十四)之建造者模式

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

QQ图片20220424162046.jpg

建造者模式(Builder):


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


使用角色:


Builder(抽象建造者)


ConcreteBuilder(具体建造者,可能有多个)


Product(产品)


Director(指挥者)


建造者UML图:


QQ图片20220424162048.jpg


建造者模式精髓:建造者模式使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。


建造者模式实现:


我去饭店吃饭,饭店的招牌菜是西红柿炒鸡蛋,饭店很火,有多位厨师(建造者类),为了避免,多个厨师做出多种口味的菜,店家将制作时需要添加的材料做成了一个秘制菜谱(建造类),厨师只要按照菜谱做,菜谱上详细的说明了材料的放置顺序,必须是先放西红柿,再放鸡蛋,再放糖,口味就不会有偏差。我去饭店吃饭,我不需要关心你的菜是怎么做出来的,我只需要告诉服务员(指挥者类)我要吃西红柿炒鸡蛋(产品),他把菜给我端上来就行了。


上代码:


产品类:Product.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    /// <summary>
    /// 产品类
    /// </summary>
    public class Product
    {
        /// <summary>
        /// 产品列表
        /// </summary>
        public List<string> productList = new List<string>();
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="name"></param>
        public void add(string name)
        {
            productList.Add(name);
        }
        /// <summary>
        /// 展示
        /// </summary>
        public void show()
        {
            for (int i = 0; i < productList.Count; i++)
            {
                Console.WriteLine(productList[i]);
            }
        }
    }
}


建造者类:Builder.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    /// <summary>
    /// 建造者类
    /// </summary>
    public abstract class Builder
    {
        /// <summary>
        /// 放西红柿
        /// </summary>
        public abstract void cai();
        /// <summary>
        /// 放糖
        /// </summary>
        public abstract void tang();
        /// <summary>
        /// 放鸡蛋
        /// </summary>
        public abstract void dan();
        /// <summary>
        /// 返回产品
        /// </summary>
        /// <returns></returns>
        public abstract Product GetResult();
    }
}


具体建造者类:BuilderOne.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    class BuilderOne:Builder
    {
        /// <summary>
        /// 建造者二
        /// </summary>
        public Product pro = new Product();
        /// <summary>
        /// 放西红柿
        /// </summary>
        public override void cai()
        {
            pro.productList.Add("大厨放西红柿");
        }
        /// <summary>
        /// 放糖
        /// </summary>
        public override void tang()
        {
            pro.productList.Add("大厨放糖");
        }
        /// <summary>
        /// 放鸡蛋
        /// </summary>
        public override void dan()
        {
            pro.productList.Add("大厨放鸡蛋");
        }
        public override Product GetResult()
        {
            return pro;
        }
    }
}


具体建造者类2:BuilderTwo.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    class BuilderTwo:Builder
    {
        /// <summary>
        /// 建造者一
        /// </summary>
        public Product pro = new Product();
        /// <summary>
        /// 放西红柿
        /// </summary>
        public override void cai()
        {
            pro.productList.Add("二厨放西红柿");
        }
        /// <summary>
        /// 放糖
        /// </summary>
        public override void tang()
        {
            pro.productList.Add("二厨放糖");
        }
        /// <summary>
        /// 放鸡蛋
        /// </summary>
        public override void dan()
        {
            pro.productList.Add("二厨放鸡蛋");
        }
        public override Product GetResult()
        {
            return pro;
        }
    }
}


指挥者类:负责指挥建造过程Director.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    /// <summary>
    /// 建造类
    /// </summary>
    public class Director
    {
        /// <summary>
        /// 指挥建造过程(不向客人展示建造过程)
        /// </summary>
        /// <param name="build"></param>
        public void waiter(Builder build)
        {
            build.cai();
            build.dan();
            build.tang();
        }
    }
}


客户端:Program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder
{
    class Program
    {
        static void Main(string[] args)
        {
            // 两个客人同时点了西红柿炒鸡蛋,大厨和二厨依次接单做
            // 大厨
            Builder build_one = new BuilderOne();
            // 二厨
            Builder build_two = new BuilderTwo();
            // 指挥者类
            Director dir = new Director();
            // 指挥大厨做饭
            dir.waiter(build_one);
            // 做完饭
            Product p1 = build_one.GetResult();
            // 上菜
            p1.show();
            Console.WriteLine("大厨上菜");
            Console.WriteLine("----------------------------------------");
            // 指挥二厨做饭
            dir.waiter(build_two);
            // 做完饭
            Product p2 = build_two.GetResult();
            // 上菜
            p2.show();
            Console.WriteLine("二厨上菜");
            Console.ReadLine();
        }
    }
}


结果如下图所示:


QQ图片20220424162051.png


建造者模式应用分析


建造者模式适用情形:


1:需要生成的产品对象有复杂的内部结构 :2: 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序 3: 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到


建造者模式特点:


1: 建造者模式的使用使得产品的内部表对象可以独立地变化。使用建造者模式可以使客户不必知道产品内部组成的细节 2:  每一个Builder都相对独立,而与其他Builder无关 3:可使对构造过程更加精细控制 :4:  将构建代码和表示代码分开 5: 建造者模式的缺点在于难于应付分步骤构建算法的需求变动



目录
相关文章
|
6月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
131 1
|
6月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
86 3
|
2月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
4天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
5月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
6月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
41 1
大话设计模式(3)——造物者一般的建造者模式
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
48 0
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75