zoukankan      html  css  js  c++  java
  • 建造者模式

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

    从建造者模式的定义来看,肯定是一头雾水,说的都是什么跟什么呀!举个小例来理解下:当我们来实现一个画画的功能,要求画瘦的人和胖的人。画的过程是稳定的,即:头、胳膊、身体、腿都是必须的。而画的具体实现是不一样的,例如:头大、肚子大、腿长等。这时再去理解建造者模式的定义就简单多了。

    UML图:

    Builder抽象类中定义各个部分的方法的抽象方法(例:定义了画胳膊、画头、画腿等方法)。
    ConcreteBuilder类是各种不一样具体表示,它具体实现了Builder中的方法,并且返回一个结果。(例:实现了具体画怎样的头、胳膊、腿等,并返回构造的这个人)
    product类是具体产品,即:要建造的产品。例:头、胳膊、腿等都是要建造人

    代码:

        //抽象建造者类
        public  abstract class Builder
        {
            public abstract void Head();
            public abstract void Body();
            public abstract void Leg();
        }
    抽象建造者类:Builder
        //具体建造者类
        class ConcreteBuilderA:Builder
        {
            private Person person = new Person();
            public override void Head()
            {
                //do something
                person.Head = "A式头";
            }
    
            public override void Body()
            {
                //do something
                person.Body = "A式身体";
            }
    
            public override void Leg()
            {
               //do something
                person.Leg = "A式腿";
            }
            public Person GetResult()
            {
                return person;
            }
        }
    具体建造者类:ConcreteBuilderA
        //具体建造者类
        class ConcreteBuilderB:Builder
        {
            private Person person = new Person();
    
            public override void Head()
            {
                //do something
                person.Head = "B式头";
            }
    
            public override void Body()
            {
                //do something
                person.Body = "B式身体";
            }
    
            public override void Leg()
            {
               //do something
                person.Leg = "B式腿";
            }
            public Person GetResult()
            {
                return person;
            }
    具体建造者类:ConcreteBuilderB
        //产品类
        class Person
        {
            public Object Head { set; get; }
            public Object Body { set; get; }
            public Object Leg { set; get; }
        }
    产品类:Person
        //指挥者类
        class Director
        {
            public void Construct(Builder builder)
            {
                builder.Head();
                builder.Body();
            }
        }
    指挥者类:Director

    执行:

            static void Main(string[] args)
            {
                Director director = new Director();
                ConcreteBuilderA a = new ConcreteBuilderA();
                director.Construct(a);
    
                Object p = a.GetResult();
            }

      上述执行代码中,首先创建执行者类,再创建一个具体建造者类,然后由执行者类调用Construct方法去执行建造。而最后通过具体建造者类的GetResult方法获得了建造的结果。

  • 相关阅读:
    FunctionGraph无缝集成Express应用
    三分钟迁移Spring boot工程到Serverless
    分布式数据库中间件使用经验分享
    基于OAS设计可扩展OpenAPI
    从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践
    分布式数据库DDM Sidecar模式负载均衡
    Redis缓存数据库安全加固指导(二)
    数据存储课后作业
    GrideVlew提供点击按钮添加新数据,单击项目修改,长按删除功能
    AutoCompleteTextView,Spinner,消息提示
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/3355216.html
Copyright © 2011-2022 走看看