建造者模式-C#改良实现
区分网上已有的一般建造者模式实现,个人觉得实现太单一了,自己google查了一些好的实现,挑了其中比较适合的,做个笔记。
# region 标准Builder模式实现
// 产品
class Television
{
public string Code { get; set; }
public string DisplayTechnology { get; set; }
public string HDFormat { get; set; }
public string ScreenType { get; set; }
public string Size { get; set; }
public string Feature { get; set; }
}
// 抽象Builer
abstract class TelevisionBuilder{
protected Television television;
public abstract void SetCode();//ProductCode
public abstract void SetDisplayTechnology(); //LCD, LED, OLED, Plasma, CRT
public abstract void SetHDFormat(); // Full HD, HD Ready, Ultra HD, None
public abstract void SetScreenType(); //Curved, Flat, Standard
public abstract void SetSize(); // 22, 32, 40, 42, 54
public abstract void SetFeature(); //3D, Smart, Standard , HDMI Ports, USB Ports, Built in WIFI, Ethernet, Remote
//获取产品
public Television Television { get => television; }
}
// 具体Builder(具体实现1)
class FullHD40TVBuilder : TelevisionBuilder
{
public FullHD40TVBuilder() => television = new Television();
public override void SetCode() => television.Code = "FullHD40TV";
public override void SetDisplayTechnology() => television.DisplayTechnology = "LCD";
public override void SetHDFormat() => television.HDFormat = "FullHD";
public override void SetScreenType() => television.ScreenType = "Flat";
public override void SetSize() => television.Size = "40";
public override void SetFeature() => television.Feature = "1 HDMI Ports, 1 USB Ports, Remote";
}
// 具体Builder(具体实现2)
class SMARTLED54TVBuilder : TelevisionBuilder
{
public SMARTLED54TVBuilder() => television = new Television();
public override void SetCode() => television.Code = "SMARTLED54TV";
public override void SetDisplayTechnology() => television.DisplayTechnology = "LED";
public override void SetHDFormat() => television.HDFormat = "FullHD";
public override void SetScreenType() => television.ScreenType = "Flat";
public override void SetSize() => television.Size = "54";
public override void SetFeature() => television.Feature = "2 HDMI Ports, 2 USB Ports, Built in WIFI, Ethernet, Remote";
}
// 环境角色(解耦作用)
class TelevisionContext {
public void Construction(TelevisionBuilder builder)
{
builder.SetCode();
builder.SetDisplayTechnology();
builder.SetFeature();
builder.SetHDFormat();
builder.SetScreenType();
builder.SetSize();
}
}
#endregion
// 在客户端调用:
var builder1 = new SMARTLED54TVBuilder();
var builder2 = new FullHD40TVBuilder();
var ctx = new TelevisionContext();
ctx.Construction(builder1);
ctx.Construction(builder2);
var product1 = builder1.Television;
var product2 = builder2.Television;
Console.WriteLine($"产品1生产完成,详细:{JsonConvert.SerializeObject(product1)}");
Console.WriteLine($"产品2生产完成,详细:{JsonConvert.SerializeObject(product2)}");
相比较来讲,这个实现更细致,而且充分利用了C#的基本语法,并没有额外在创建一个函数返回产品,相对更简洁更"高大上",哈哈....
建造者模式-C#改良实现的更多相关文章
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- PHP设计模式(五)建造者模式(Builder For PHP)
建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...
- java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- C#设计模式之建造者模式
建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节. 建造者模式:将一个复杂对象 ...
- C#设计模式-建造者模式
在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由C ...
- C#设计模式系列:建造者模式(Builder)
1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
随机推荐
- 获取JVM转储文件的Java工具类
在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法.这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获 ...
- Date、Calendar和GregorianCalendar的使用
java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Date public st ...
- CentOS 7 安装并配置 MySQL 5.7
Linux使用MySQL Yum存储库上安装MySQL 5.7,适用于Oracle Linux,Red Hat Enterprise Linux和CentOS系统. 1.添加MySQL Yum存储库 ...
- 带你从头到尾捋一遍MySQL索引结构(1)
从一个简单的表开始 create table user( id int primary key, age int, height int, weight int, name varchar(32) ) ...
- 自然语言处理(NLP)相关学习资料/资源
自然语言处理(NLP)相关学习资料/资源 1. 书籍推荐 自然语言处理 统计自然语言处理(第2版) 作者:宗成庆 出版社:清华大学出版社:出版年:2013:页数:570 内容简介:系统地描述了神经网络 ...
- github配置ssh key
一 初次安装git配置用户名和邮箱 git config --global user.name "xxx" git config --global user.email " ...
- Java中的try-catch-finally异常处理
Java中的try-catch-finally异常处理 一.异常处理 异常(Exception):是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3 } ...
- ARTS-S centos查看端口被哪个进程占用
netstat -tunlp | grep 80 或者 lsof -i:80
- 关于C 语言的字符串常量拼接
问题记录: C语言中,字符串是否可以通过连续的常量创建直接编辑拼接在一起? 比如下述语句赋值: const char *path = “this is string one” “this is s ...
- Happy Birthday! 今天我 1 周岁生日啦!
2018.09.28,我第 1 天分享文章. 2019.09.28,我连续分享的第 365 天. 今天我 1 周岁啦! 生日意味着一个新的开端, 意味着重新把握生活的机会. 新的一岁,从新头像开始 愿 ...