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

最近这个脑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. 2流高手速成记(之七):基于Dubbo&Nacos的微服务简要实现

    本节内容会用到之前给大家讲过的这两篇: 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba 2流高手速成记(之三):SpringBoot整合mybatis/mybat ...

  2. .NET周报【11月第1期 2022-11-07】

    国内文章 开源·安全·赋能 - .NET Conf China 2022 https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg .NET Conf Chi ...

  3. Vscode连接gitee远程仓库

    Git初始化项目 1. Git的基础配置 Git的安装配置 下载地址为:http://git-scm.com/downloads 安装完第一步要做的是,设置你的用户名和邮件地址. git config ...

  4. JavaScript入门④-万物皆对象:Object

    01.Object对象 Object 是 JavaScript 的一种 数据类型,它用于存储各种键值集合和更复杂的实体,是一组数据和功能的集合.JS中几乎所有对象都是继承自Object,Array.R ...

  5. 【PostgreSQL/PGSQL】创建分区表与临时表

    一.分区表 1.链接 https://blog.csdn.net/zhangyupeng0528/article/details/119423234 2.分类 列(值)分区表:partition by ...

  6. JavaEE Day02MySQL

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL语句 一.数据库的基本概念 1.数据库DataBase,简称DB 2.什么是数据库?         用于存储和管理数据的仓库 ...

  7. 【Hadoop学习】下:MapReduce程序编写、Hadoop序列化、框架原理、Yarn组件、设置队列

    一.MapReduce概述 1.定义 编程框架,组成分布式运算程序,运行在集群上 2.特点 优点:易于编程.扩展性.容错性(内部完成).海量数据离线处理 缺点:非实时.不擅长流式计算.不擅长DAG有向 ...

  8. STM32用PWM波控制呼吸灯代码

    pwm.c #include "pwm.h" //TIM3-CH3 //PB0 void PWM_Config(void) { GPIO_InitTypeDef GPIO_Init ...

  9. 常用的渗透测试工具——SQLMap安装

    SQLMap是一个自动化的SQL注入工具,其主要功能是扫描.发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL.Qracle.PostgreSQL.Microsoft ...

  10. C#多线程(四)并行编程篇之结构化

    前言 在前三章中我们的案例大量使用到了Thread这个类,通过其原始API,对其进行创建.启动.中断.中断.终止.取消以及异常处理,这样的写法不仅不够优雅(对接下来这篇,我称其为.NET现代化并行编程 ...