2020-11-23

建造者模式

一、建造者模式的详细介绍
1.1建造者模式的具体实现
在这个例子中,电脑城的老板是直接与客户(也就是采购员)联系的,然而电脑的组装是由老板指挥装机人员去把电脑的各个部件组装起来,真真负责创建产品的人就是电脑城的装机人员。理清这个逻辑过程之后,下面就具体看下如何用代码来表示这种现实生活中的逻辑过程:

using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6
7 ///
8 /// 以组装电脑为例子
9 /// 每台电脑的组成过程都是一致的,但是使用同样的构建过程可以创建不同的表示(即可以组装成不一样的电脑,配置不一样)
10 /// 组装电脑的这个场景就可以应用建造者模式来设计
11 ///
12 namespace 设计模式之建造者模式
13 {
14 ///
15 /// 客户类
16 ///
17 class Customer
18 {
19 static void Main(string[] args)
20 {
21 // 客户找到电脑城老板说要买电脑,这里要装两台电脑
22 // 创建指挥者和构造者
23 Director director = new Director();
24 Builder b1 = new ConcreteBuilder1();
25 Builder b2 = new ConcreteBuilder2();
26
27 // 老板叫员工去组装第一台电脑
28 director.Construct(b1);
29
30 // 组装完,组装人员搬来组装好的电脑
31 Computer computer1 = b1.GetComputer();
32 computer1.Show();
33
34 // 老板叫员工去组装第二台电脑
35 director.Construct(b2);
36 Computer computer2 = b2.GetComputer();
37 computer2.Show();
38
39 Console.Read();
40 }
41 }
42
43 ///
44 /// 小王和小李难道会自愿地去组装嘛,谁不想休息的,这必须有一个人叫他们去组装才会去的
45 /// 这个人当然就是老板了,也就是建造者模式中的指挥者
46 /// 指挥创建过程类
47 ///
48 public class Director
49 {
50 // 组装电脑
51 public void Construct(Builder builder)
52 {
53 builder.BuildPartCPU();
54 builder.BuildPartMainBoard();
55 }
56 }
57
58 ///
59 /// 电脑类
60 ///
61 public class Computer
62 {
63 // 电脑组件集合
64 private IList parts = new List();
65
66 // 把单个组件添加到电脑组件集合中
67 public void Add(string part)
68 {
69 parts.Add(part);
70 }
71
72 public void Show()
73 {
74 Console.WriteLine(“电脑开始在组装…”);
75 foreach (string part in parts)
76 {
77 Console.WriteLine(“组件”+part+“已装好”);
78 }
79
80 Console.WriteLine(“电脑组装好了”);
81 }
82 }
83
84 ///
85 /// 抽象建造者,这个场景下为 “组装人” ,这里也可以定义为接口
86 ///
87 public abstract class Builder
88 {
89 // 装CPU
90 public abstract void BuildPartCPU();
91 // 装主板
92 public abstract void BuildPartMainBoard();
93
94 // 当然还有装硬盘,电源等组件,这里省略
95
96 // 获得组装好的电脑
97 public abstract Computer GetComputer();
98 }
99
100 ///
101 /// 具体创建者,具体的某个人为具体创建者,例如:装机小王啊
102 ///
103 public class ConcreteBuilder1 : Builder
104 {
105 Computer computer = new Computer();
106 public override void BuildPartCPU()
107 {
108 computer.Add(“CPU1”);
109 }
110
111 public override void BuildPartMainBoard()
112 {
113 computer.Add(“Main board1”);
114 }
115
116 public override Computer GetComputer()
117 {
118 return computer;
119 }
120 }
121
122 ///
123 /// 具体创建者,具体的某个人为具体创建者,例如:装机小李啊
124 /// 又装另一台电脑了
125 ///
126 public class ConcreteBuilder2 : Builder
127 {
128 Computer computer = new Computer();
129 public override void BuildPartCPU()
130 {
131 computer.Add(“CPU2”);
132 }
133
134 public override void BuildPartMainBoard()
135 {
136 computer.Add(“Main board2”);
137 }
138
139 public override Computer GetComputer()
140 {
141 return computer;
142 }
143 }
144 }

二、建造者模式的分析
建造者模式的实现要点:
1.在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
2.建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的变化如硬盘的大小变了,CPU由单核变双核等)。
3.产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
4.抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是“产品部分”的需求变化。
5.由于建造者模式隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要在实现一个具体的建造者就可以了,从而很好地应对产品组成组件的需求变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的SimpleDateFormat类将String类型的时间转换为Date对象,然后再对Date对象进行处理。 首先,我们先将时间段转换为【2020-11-20 00:00:00,2021-10-09 23:59:59】,即将结束时间改为当天的最后一秒: ```java String startTime = "2020-11-20 09:09:09"; String endTime = "2021-10-09 10:10:10"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startDate = sdf.parse(startTime); Date endDate = sdf.parse(endTime); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); endCalendar.set(Calendar.HOUR_OF_DAY, 23); endCalendar.set(Calendar.MINUTE, 59); endCalendar.set(Calendar.SECOND, 59); endDate = endCalendar.getTime(); String newEndTime = sdf.format(endDate); System.out.println(newEndTime); ``` 输出结果为:2021-10-09 23:59:59 接下来,我们可以使用一个循环,每次增加一天,输出该天的开始时间和结束时间: ```java Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); while (calendar.getTime().before(endDate)) { Date startOfDay = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date endOfDay = calendar.getTime(); System.out.println(sdf.format(startOfDay) + " - " + sdf.format(endOfDay)); } // 输出最后一天的开始时间和结束时间 Date startOfDay = calendar.getTime(); System.out.println(sdf.format(startOfDay) + " - " + newEndTime); ``` 输出结果为: ``` 2020-11-20 09:09:09 - 2020-11-21 00:00:00 2020-11-21 00:00:00 - 2020-11-22 00:00:00 2020-11-22 00:00:00 - 2020-11-23 00:00:00 ... 2021-10-07 00:00:00 - 2021-10-08 00:00:00 2021-10-08 00:00:00 - 2021-10-09 00:00:00 2021-10-09 00:00:00 - 2021-10-09 23:59:59 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值