学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

最近这个脑T---瘫----CSDN有毛病吧?我写这个都是涉及到广告了?谁家的广告? 谁给我钱了?审核策略设计者是什么NTR?

模式的定义与特点

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

建造者模式的优点:

  1. 封装性好,构建和表示分离。
  2. 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
  3. 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。

建造者模式的缺点:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

        建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式(抽象工厂模式、简单工厂模式)更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现

建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。

建造者(Builder)模式的主要角色如下。

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

//============================================================客户端代码
#region Builder
public static void BuilderTest1()
{
BuilderDirector director = new BuilderDirector();
director.Build(new BuilderWorker()).BuilderProductToString();
Console.WriteLine();
} public static void BuilderTest2()
{
BuilderDirector1 director1 = new BuilderDirector1();
//按照客户制定的来
BuilderWorker1 worker1 = new BuilderWorker1();
worker1.BuildB("222BBB").BuildD("444DDD");
director1.Build(worker1).BuilderProductToString();
Console.WriteLine("=============分割线=============");
//默认顺序
BuilderWorker1 worker11 = new BuilderWorker1();
director1.Build(worker11).BuilderProductToString();
Console.WriteLine("=============分割线============="); //自己 换一个建造者 接着打造该产品
worker1 = new BuilderWorker1(worker1.GetProduct());
worker1.BuildB("我又修改了");
director1.Build(worker1).BuilderProductToString();
}
#endregion //============================================================建造者基类
namespace StudyDesignMode.Builder
{
//工作服务者基类,按步骤流程 有顺序的来
public abstract class Builder
{
public abstract void BuildA();
public abstract void BuildB();
public abstract void BuildC();
public abstract void BuildD();
public abstract BuilderProduct GetProduct();
} //工作服务者基类,无序,按照客户要求来
public abstract class Builder1
{
public abstract Builder1 BuildA(string builderMsg);
public abstract Builder1 BuildB(string builderMsg);
public abstract Builder1 BuildC(string builderMsg);
public abstract Builder1 BuildD(string builderMsg);
public abstract BuilderProduct GetProduct();
}
} //============================================================建造者类
namespace StudyDesignMode.Builder
{
//工作服务者
public class BuilderWorker : Builder
{
private BuilderProduct m_product; public BuilderWorker() { m_product = new BuilderProduct(); } public override void BuildA()
{
m_product.SetBuildA("Bulider_A");
Console.WriteLine("Bulider_A");
} public override void BuildB()
{
m_product.SetBuildB("Bulider_B");
Console.WriteLine("Bulider_B");
} public override void BuildC()
{
m_product.SetBuildC("Bulider_C");
Console.WriteLine("Bulider_C");
} public override void BuildD()
{
m_product.SetBuildD("Bulider_D");
Console.WriteLine("Bulider_D");
} public override BuilderProduct GetProduct(){ return m_product; }
} public class BuilderWorker1 : Builder1
{
private BuilderProduct m_product; public BuilderWorker1() { m_product = new BuilderProduct(); }
public BuilderWorker1(BuilderProduct product) { m_product = product; }
public override Builder1 BuildA(string builderMsg)
{
m_product.SetBuildA(builderMsg);
Console.WriteLine($"BuildA做出更改{builderMsg}");
return this;
} public override Builder1 BuildB(string builderMsg)
{
m_product.SetBuildB(builderMsg);
Console.WriteLine($"BuildB做出更改{builderMsg}");
return this;
} public override Builder1 BuildC(string builderMsg)
{
m_product.SetBuildC(builderMsg);
Console.WriteLine($"BuildC做出更改{builderMsg}");
return this;
} public override Builder1 BuildD(string builderMsg)
{
m_product.SetBuildD(builderMsg);
Console.WriteLine($"BuildD做出更改{builderMsg}");
return this;
} public override BuilderProduct GetProduct() { return m_product; }
}
} //============================================================建造产品类
namespace StudyDesignMode.Builder
{
public class BuilderProduct
{
private string builderA = "ProductA";
private string builderB = "ProductB";
private string builderC = "ProductC";
private string builderD = "ProductD"; public string GetBuildA(string build){ return builderA; }
public void SetBuildA(string build){ builderA = build; }
public string GetBuildB(string build) { return builderB; }
public void SetBuildB(string build) { builderB = build; }
public string GetBuildC(string build) { return builderC; }
public void SetBuildC(string build) { builderC = build; }
public string GetBuildD(string build) { return builderD; }
public void SetBuildD(string build) { builderD = build; } public void BuilderProductToString()
{
Console.WriteLine($"builderA = {builderA}");
Console.WriteLine($"builderB = {builderB}");
Console.WriteLine($"builderC = {builderC}");
Console.WriteLine($"builderD = {builderD}");
}
}
} //============================================================指挥官类
namespace StudyDesignMode.Builder
{
//指挥官
public class BuilderDirector
{
public BuilderProduct Build(Builder builder)
{
builder.BuildA();
builder.BuildB();
builder.BuildC();
builder.BuildD();
return builder.GetProduct();
}
} public class BuilderDirector1
{
public BuilderProduct Build(Builder1 builder)
{
return builder.GetProduct();
}
}
}

总结

用例子来说比较清楚明了:

假设我们目前有一个需求,有好多不同的工厂,其中的飞机场需要建造战斗机去战斗。

那我们需要通过抽象工厂模式或者工厂模式,编写不同的工厂,然后在其中的飞机工厂中获取飞机。那么飞机工厂只能提供已经组装好的飞机,那组装好的飞机从何而来?  这就需要我们通过建造者模式,去把战斗机的零件一个一个的生产出来,然后提供给飞机工厂。


希望大家:点赞,留言,关注咯~    

唠家常

  • Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我的QQ:841298494 (记得备注),大家一起进步

今日无推荐

创建型模式 - 建造者模式Builder的更多相关文章

  1. [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)

    一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...

  2. 设计模式01 创建型模式 - 建造者模式(Build Pattern)

    参考 1. Builder Design Pattern | Youtube 2. 建造者模式(Builder和Director)| 博客园 3. 深入理解Builder模式 | 简书 建造者模式(B ...

  3. java设计模式--创建模式--建造者模式

    对于建造者模式,小编个人理解为就是一个组装型的模式. 建造者模式 概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 1.当创建复杂对象的算法应该独立于该对象的组 ...

  4. JAVA设计模式 2【创建型】原型模式的理解与使用

    在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...

  5. Builder模式(建造者模式)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  6. 【创建型】Prototype模式

    原型模式主要是用原型实例指定创建原型对象的种类,并且通过拷贝原型创建新对象.最简单的理解就是克隆.就如cocos2d-x中的 class Clonable::clone();该模式的主要目的是可以在运 ...

  7. 【创建型】Singleton模式

    单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...

  8. python设计模式---创建型之工厂模式

    # coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...

  9. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

随机推荐

  1. 构建LNP镜像

    1.构建ubuntu-base环境  #10.0.0.28:  [root@rocky8 ubuntu_base]#vim Dockerfile  FROM ubuntu:20.04  LABEL m ...

  2. Python基础之模块:3、os模块 sys模块 json模块 json实战

    目录 一.os模块 1.创建目录 2.删除目录 3.查看指定路径下目录内容 4.删除/重命名文件 5.获取/切换当前目录 6.动态获取项目根路径 7.拼接/切割路径 8.判断文件.目录是否存在 9.判 ...

  3. pod(八):pod的调度——将 Pod 指派给节点

    目录 一.系统环境 二.前言 三.pod的调度 3.1 pod的调度概述 3.2 pod自动调度 3.2.1 创建3个主机端口为80的pod 3.3 使用nodeName 字段指定pod运行在哪个节点 ...

  4. WCF实现大文件上传

    一.文件服务接口 1.文件上传 2.文件传输(上传按钮) 3.文件传输停止 服务地址: 在客端添加服务器引用,从而实现客户端调用服务器的功能. 二.契约 服务契约[ServiceContract]:定 ...

  5. Apache ShenYu 集成 RocketMQ 实时采集海量日志的实践

    本文作者:胡泰室, 快手Java开发工程师. ​ 认识Apache ShenYu(神禹) 网关最重要的是流量治理,而流量治理与大禹治水有很多相似的地方,因此,网关的流量治理项目被命名为神禹. Shen ...

  6. gRPC(Java) keepAlive机制研究

    基于java gRPC 1.24.2 分析 结论 gRPC keepAlive是grpc框架在应用层面连接保活的一种措施.即当grpc连接上没有业务数据时,是否发送pingpong,以保持连接活跃性, ...

  7. python-简单模块的使用

    提示:简单模块了解掌握 @ 目录 uuid模块 calendar日历模块 time模块 datetime模块 os模块 sys模块 random模块 json和pickle模块 json pickle ...

  8. 微信小程序实战,基于vue2实现瀑布流

    1.什么是瀑布流呢? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 瀑布流对于图片的展现, ...

  9. kubernetes CKA题库(附答案)

    第一题 RBAC授权问题权重: 4% 设置配置环境:[student@node-1] $ kubectl config use-context k8s Context为部署管道创建一个新的Cluste ...

  10. python random模块几个常用方法

    python random模块几个常用方法 random.random()方法 random.uniform(a, b)方法 random.randint(a, b)方法 random.randran ...