zoukankan      html  css  js  c++  java
  • js建造者(生成器)模式

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

    在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。

    建造者模式类图:

    建造者模式的分析

    介绍完了建造者模式的具体实现之后,让我们总结下建造模式的实现要点:

    1. 建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
    2. 建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。
    3. 产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
    4. 在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
    5. 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。

    C#的建造者模式:

    namespace 建造者模式
    {
        abstract class PersonBuilder
        {
            protected Graphics g;
            protected Pen p;
    
            public PersonBuilder(Graphics g, Pen p)
            {
                this.g = g;
                this.p = p;
            }
    
            public abstract void BuildHead();
            public abstract void BuildBody();
            public abstract void BuildArmLeft();
            public abstract void BuildArmRight();
            public abstract void BuildLegLeft();
            public abstract void BuildLegRight();
        }
    
        class PersonThinBuilder : PersonBuilder
        {
            public PersonThinBuilder(Graphics g, Pen p)
                : base(g, p)
            { }
    
            public override void BuildHead()
            {
                g.DrawEllipse(p, 50, 20, 30, 30);
            }
    
            public override void BuildBody()
            {
                g.DrawRectangle(p, 60, 50, 10, 50);
            }
    
            public override void BuildArmLeft()
            {
                g.DrawLine(p, 60, 50, 40, 100);
            }
    
            public override void BuildArmRight()
            {
                g.DrawLine(p, 70, 50, 90, 100);
            }
    
            public override void BuildLegLeft()
            {
                g.DrawLine(p, 60, 100, 45, 150);
            }
    
            public override void BuildLegRight()
            {
                g.DrawLine(p, 70, 100, 85, 150);
            }
        }
    
        class PersonFatBuilder : PersonBuilder
        {
            public PersonFatBuilder(Graphics g, Pen p)
                : base(g, p)
            { }
    
            public override void BuildHead()
            {
                g.DrawEllipse(p, 50, 20, 30, 30);
            }
    
            public override void BuildBody()
            {
                g.DrawEllipse(p, 45, 50, 40, 50);
            }
    
            public override void BuildArmLeft()
            {
                g.DrawLine(p, 50, 50, 30, 100);
            }
    
            public override void BuildArmRight()
            {
                g.DrawLine(p, 80, 50, 100, 100);
            }
    
            public override void BuildLegLeft()
            {
                g.DrawLine(p, 60, 100, 45, 150);
            }
    
            public override void BuildLegRight()
            {
                g.DrawLine(p, 70, 100, 85, 150);
            }
        }
    
        class PersonDirector
        {
            private PersonBuilder pb;
            public PersonDirector(string type, Graphics g, Pen p)
            {
                string assemblyName = "建造者模式";
                object[] args = new object[2];
                args[0] = g;
                args[1] = p;
    
                this.pb = (PersonBuilder)Assembly.Load(assemblyName).CreateInstance(assemblyName + ".Person" + type + "Builder", false, BindingFlags.Default, null, args, null, null);
            }
    
            public void CreatePerson()
            {
                pb.BuildHead();
                pb.BuildBody();
                pb.BuildArmLeft();
                pb.BuildArmRight();
                pb.BuildLegLeft();
                pb.BuildLegRight();
            }
        }
    }
    namespace 建造者模式
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Pen p = new Pen(Color.Yellow);
                PersonDirector pdThin = new PersonDirector("Thin", pictureBox1.CreateGraphics(), p);
                pdThin.CreatePerson();
    
                PersonDirector pdFat = new PersonDirector("Fat", pictureBox2.CreateGraphics(), p);
                pdFat.CreatePerson();
            }
        }
    }
  • 相关阅读:
    Spring入门之通过注解 处理 数据库事务
    Spring 入门之-dao使用jdbcTemplate(注入过程)
    spring入门之JdbcTemplate 操作crud
    npm 包 升降版本
    vue-cli初始化一个项目
    <meta http-equiv="refresh" content="0; url=">
    vue-router的两种模式的区别
    Webstorm 的 Tab 键怎样调整缩进值? 调节成缩进成2个空格或者4个空格
    去抖函数 节流函数
    创建一个vue项目,vue-cli,webpack
  • 原文地址:https://www.cnblogs.com/gongshunkai/p/6605639.html
Copyright © 2011-2022 走看看