创建型模式 - 建造者模式Builder
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
最近这个脑T---瘫----CSDN有毛病吧?我写这个都是涉及到广告了?谁家的广告? 谁给我钱了?审核策略设计者是什么NTR?
模式的定义与特点
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式的优点:
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
建造者模式的缺点:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式(抽象工厂模式、简单工厂模式)更注重零部件的创建过程,但两者可以结合使用。
模式的结构与实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
建造者(Builder)模式的主要角色如下。
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(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 (记得备注),大家一起进步
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
创建型模式 - 建造者模式Builder的更多相关文章
- [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)
一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...
- 设计模式01 创建型模式 - 建造者模式(Build Pattern)
参考 1. Builder Design Pattern | Youtube 2. 建造者模式(Builder和Director)| 博客园 3. 深入理解Builder模式 | 简书 建造者模式(B ...
- java设计模式--创建模式--建造者模式
对于建造者模式,小编个人理解为就是一个组装型的模式. 建造者模式 概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 1.当创建复杂对象的算法应该独立于该对象的组 ...
- JAVA设计模式 2【创建型】原型模式的理解与使用
在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...
- Builder模式(建造者模式)
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- 【创建型】Prototype模式
原型模式主要是用原型实例指定创建原型对象的种类,并且通过拷贝原型创建新对象.最简单的理解就是克隆.就如cocos2d-x中的 class Clonable::clone();该模式的主要目的是可以在运 ...
- 【创建型】Singleton模式
单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...
- python设计模式---创建型之工厂模式
# coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...
- Java经典设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
随机推荐
- Python基础之函数:3、多层语法糖、装饰器和装饰器修复技术及递归函数
目录 一.多层语法糖 1.什么是多层语法糖: 2.多层语法糖用法: 二.有参装饰器 1.什么是有参装饰器: 2.有参装饰器的作用: 三.装饰器修复技术 1.什么是装饰器修复技术: 四.递归函数 1.什 ...
- Java注解和反射笔记
Java注解和反射笔记 1 注解 1.1 定义 Annotation是从JDK1.5开始引入的技术 作用 不是程序本身,可以对程序作出解释 可以被其他程序(编译器等)读取 格式 @注释名,可以添加一些 ...
- dockerNginx代理本地目录
dockerNginx代理本地目录 ssl_certificate cert/5900588_test.zk.limengkai.work.pem; ssl_certificate_key cert/ ...
- C#使用不安全指针来操作bitmap
C#允许通过不安全指针实现像C++一样操作指针,这个速度是最快的.下面这个例子是修改一幅RGB图像的每个像素值,速度很快,测试一张2592*1944的彩色图像,只需要几ms就能够全部遍历. /// & ...
- Go语言核心36讲24
你好,我是郝林,今天我们继续来聊聊panic函数.recover函数以及defer语句的内容. 我在前一篇文章提到过这样一个说法,panic之中可以包含一个值,用于简要解释引发此panic的原因. 如 ...
- elasticsearch 之 histogram 直方图聚合
目录 1. 简介 2. bucket_key如何计算 3. 有一组数据,如何确定是落入到那个桶中 4.需求 4.1 准备mapping 4.2 准备数据 5.histogram聚合操作 5.1.根据r ...
- Linux下用rm误删除文件的三种恢复方法
Linux下用rm误删除文件的三种恢复方法 对于rm,很多人都有惨痛的教训.我也遇到一次,一下午写的程序就被rm掉了,幸好只是一个文件,第二天很快又重新写了一遍.但是很多人可能就不像我这么幸运了.本文 ...
- day09 常用工具类&包装类&集合——List、Set
day09 常用工具类 java.lang.Math数值运算 基本数值运算,如初等函数.对数.平方根和三角函数 //最大最小值 Math.max(12, 21); Math.min(2, 3); // ...
- Android ViewPager2 + TabLayout + BottomNavigationView
Android ViewPager2 + TabLayout + BottomNavigationView 实际案例 本篇主要介绍一下 ViewPager2 + TabLayout + BottomN ...
- elasticsearch global 、 filters 和 cardinality 聚合
目录 1. 背景 2.解释 1.global 2.filters 3.cardinality 3.需求 4.前置条件 4.1 创建mapping 4.2 准备数据 5.实现3的需求 5.1 dsl 5 ...
