设计模式(二)-创建者模式(5)-建造者模式

一、为何需要建造者模式(Builder)?

在软件系统中,会存在一个复杂的对象,复杂在于该对象包含了很多不同的功能模块。该对象里的各个部分都是按照一定的算法组合起来的。

为了要使得复杂对象里的各个部分的独立性,以及将它们组合在一起的算法需要保持固定(不会轻易改变其算法逻辑),不会随着新需求改变从而改变原有的逻辑。此时就需要用建造者模式了。

特点:

将一个复杂对象的构建和其各个部分之间分离,在同一个算法组合里可以创建出不同的对象。

  • 部件的算法组合、对象的构建、部件的实现之间进行分离。

结构

  • 产品类(Product):存在产品的所有部件属性,需要用来创建的复杂对象。
  • 建造创建者类(Builder):抽象类,定义复杂对象的部件创建的规范(抽象方法)。
  • 具体创建类(ConCreateBuilder):实现 Builder 接口方法,完成具体产品的创建。
  • 指挥者类(Director):由指挥者类来调用具体创建者类的方法按照一定的顺序来组装,返回完整的对象产品。

适合应用场景的特点:

  • 产品类里具有不同型号产品的共同属性。(如下文例子中的渐变颜色,形状)
  • 部件的型号不同,创建的逻辑也很可能不相同。(如有不同的代码逻辑来创建形状Point)
  • 部件的组合方式是固定的。(如设置渐变颜色和形状的组合算法是固定的)

二、例子

需求:

实现一个画图程序。根据不同形状和不同渐变颜色来创建一个图形。比如,创建一个红橙按比例 50:100 渐变的矩形;创建一个白灰黑按比例 50:70:100 渐变的三角形。(为了方便理解,下面例子不写得过于复杂,就不使用 Graphics 和 Pen 的复杂方式绘图,而使用 Point 数组进行简单绘图)

1、产品:

c 复制代码
    //产品类里具有不同型号产品的共同属性。
    public sealed class Sharp
    {
        public Point[] point { get; private set; }

        public List<Colors> colors { get; private set; }

        public void setPoint(Point[] p) { point = p; }
        public void setColors(List<Colors> colors) { this.colors = colors; }
    }
    //Sharp 属性:形状
    public struct Point
    {
        public double x;
        public double y;
    }
    //Sharp 属性:渐变颜色
    public class Colors
    {
        public string Rgb { get; set; }
        public double GradientValue { get; set; }
        public Colors(string rgb,double gradient)
        {
            Rgb = rgb;
            GradientValue = gradient;
        }
    }

2、抽象建造者:

c 复制代码
public abstract class Builder
    {
        protected Sharp Sharp { get; set; }
        public Builder()
        {
            Sharp = new Sharp();
        }

        public Sharp GetSharp()
        {
            return Sharp;
        }
        //部件的组合方式是固定的
        public abstract void BuilderSharp();
        public abstract void BuilderColors();
    }

3、构造建造者(具体创建者):

c 复制代码
//矩形构造者
    public class RectSharpBuilder : Builder
    {
        //部件的型号不同,创建的逻辑也很可能不相同。同下
        public override void BuilderSharp()
        {
            Point[] point = new Point[4];
            point[0].x = 0; point[0].y = 0;
            point[1].x = 0; point[1].y = 10;
            point[2].x = 10; point[2].y = 0;
            point[3].x = 10; point[3].y = 10;

            Sharp.setPoint(point);
        }

        public override void BuilderColors()
        {
            List<Colors> colors = new List<Colors>()
            {
                new Colors("Red",50),
                new Colors("Orange",100)
            };
            Sharp.setColors(colors);
        }
    }

    //三角形构造者
    public class TriangleSharpBuilder : Builder
    {
        public override void BuilderSharp()
        {
            Point[] point = new Point[3];
            point[0].x = 0; point[0].y = 10;
            point[1].x = 5; point[1].y = 0;
            point[2].x = 10; point[2].y = 10;
            Sharp.setPoint(point);
        }

        public override void BuilderColors()
        {
            List<Colors> colors = new List<Colors>()
            {
                new Colors("White",50),
                new Colors("Gray",70),
                new Colors("Black",100)
            };
            Sharp.setColors(colors);
        }
    }

4、指导者:

c 复制代码
public class Director
    {   //部件的组合方式是固定的
        public Sharp BuildSharp(Builder builder)
        {
            builder.BuilderSharp();
            builder.BuilderColors();

            return builder.GetSharp();
        }
    }

5、主程序:

c 复制代码
class Program
    {
        static void Main(string[] args)
        {
            Director director = new Director();

            Builder RectSharp = new RectSharpBuilder();
            Builder TriangleSharp = new TriangleSharpBuilder();

            director.BuildSharp(RectSharp);
            director.BuildSharp(TriangleSharp);
            Console.ReadLine();
        }
    }
相关推荐
GISer_Jing12 分钟前
AI:多智能体协作与记忆管理
人工智能·设计模式·aigc
雨中飘荡的记忆2 小时前
责任链模式实战应用:从理论到生产实践
设计模式
沛沛老爹5 小时前
Web开发者进阶AI:Agent技能设计模式之迭代分析与上下文聚合实战
前端·人工智能·设计模式
Geoking.6 小时前
【设计模式】装饰者模式详解
设计模式·装饰器模式
vx-bot5556667 小时前
企业微信接口在自动化工作流中的关键角色与设计模式
设计模式·自动化·企业微信
Yu_Lijing8 小时前
基于C++的《Head First设计模式》笔记——工厂模式
c++·笔记·设计模式
HL_风神1 天前
设计原则之迪米特
c++·学习·设计模式
HL_风神1 天前
设计原则之合成复用
c++·学习·设计模式
Aeside11 天前
揭秘 Nginx 百万并发基石:Reactor 架构与 Epoll 底层原理
后端·设计模式
帅气的你1 天前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式