设计模式(二)-创建者模式(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();
        }
    }
相关推荐
小白不太白9502 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白9503 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in4 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in4 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)4 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep5 小时前
干掉 if else 之策略模式
后端·设计模式
哪 吒12 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_102212 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神15 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术16 小时前
23种设计模式速记法
设计模式