设计模式之建造者模式

  建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(转至《大话设计模式》)。

  学习这个模式后,不知觉得和之前的简单工厂模式做了对比,发现二者都是创建对象。但二者还是有所区别的,简单工厂模式是更具不同的情况创建不同的对象,

而建造者模式则主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部

的构建通常面临复杂的变化。

  建造者模式的好处就是使得建造代码与表示代码分离,由于建造模式印厂了该产品是如何组装的,所以需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

下面的代码:是利用Graphics来画图。

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 建造者模式
{
    public class Man
    {
        private Pen p;
        private Graphics g;
        public Pen P
        {
            get
            {
                return p;
            }
            set
            {
                p = value;
            }
        }
        public Graphics G
        {
            get
            {
                return g;
            }
            set
            {
                g = value;
            }
        }
        public Man(Pen myP, Graphics myG)
        {
            this.p = myP;
            this.g = myG;
        }
        public virtual void buildHead() { }
        public virtual void buildBody() { }
        public virtual void buildLeftArm() { }
        public virtual void buildRightArm() { }
        public virtual void buildLeftLeg() { }
        public virtual void buildRightLeg() { }
    }
    public class thinMan : Man
    {
        public thinMan(Pen p, Graphics g)
            : base(p, g)
        {
        }
        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 buildLeftArm()
        {
            G.DrawLine(P, 60, 50, 40, 100);
        }
        public override void buildRightArm()
        {
            G.DrawLine(P, 70, 50, 90, 100);
        }
        public override void buildLeftLeg()
        {
            G.DrawLine(P, 60, 100, 45, 150);
        }
        public override void buildRightLeg()
        {
            G.DrawLine(P, 70, 100, 85, 150);
        }
    }
    public class fatMan:Man
    {
        public fatMan(Pen p, Graphics g) : base(p, g) { }
        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 buildLeftArm()
        {
            G.DrawLine(P, 50, 50, 30, 100);
        }
        public override void buildRightArm()
        {
            G.DrawLine(P, 80, 50, 100, 100);
        }
        public override void buildLeftLeg()
        {
            G.DrawLine(P, 60, 100, 45, 150);
        }
        public override void buildRightLeg()
        {
            G.DrawLine(P, 70, 100, 85, 150);
        }
    }
    public class manBuilder
    {
        Man m;
        public manBuilder(Man mM)
        {
            this.m = mM;
        }
        public void Show()
        {
            m.buildHead();
            m.buildBody();
            m.buildLeftArm();
            m.buildRightArm();
            m.buildLeftLeg();
            m.buildRightLeg();
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Blue);
            Graphics gThin = pictureBox1.CreateGraphics();
            thinMan tMan = new thinMan(p, gThin);
            manBuilder m = new manBuilder(tMan);
            m.Show();
            Graphics gFat = pictureBox2.CreateGraphics();
            fatMan fMan = new fatMan(p, gFat);
            manBuilder m1 = new manBuilder(fMan);
            m1.Show();
        }
    }
}
复制代码

运行结果:

posted @   张杨  阅读(256)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示