设计模式Day02
1、生成器模式
生成器模式也称为建造者模式。生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
生成器模式的编程步骤:
(1)定义一个产品类;
由于不在该类完成Product类对象的创建,所以无需显示定义构造方法。
(2)定义n个生成器Build类;
生成器是用来生成Product对象的,因此一般来说,Product是生成器类的一个成员变量;每创建一个Product对象,本质上先创建Unit1,Unit2,...UnitN,再把它们组合成所需的Product对象,因此需要n个createUnit()方法及一个组合方法composite();由于createUnit()及composite()是共性,因此可定义共同的生成器类接口,n个生成器类均从此接口派生即可。
(3)定义一个统一调度类,也叫指挥者类。是对生成器接口IBuild的封装。
生成器设计模式涉及4个关键角色:产品(Product)、抽象生成器(IBuild)、具体生成器(Builder)、指挥者(Director)。在生成器模式中,抽象生成器和具体生成器是必需的,指挥者类需要在实际问题中认真考虑,加以取舍。
[代码]java代码:
|
1
2
3
|
public class Unit1 {}public class Unit2 {}public class Unit3 {} |
[代码]java代码:
|
1
2
3
4
5
6
|
//定义一个产品类public class Product { Unit1 u1; Unit2 u2; Unit3 u3;} |
[代码]java代码:
|
1
2
3
4
5
6
7
|
//定义生成器类接口IBuildpublic interface IBuild { public void createUnit1(); public void createUnit2(); public void createUnit3(); public Product composite();//返回值是Product对象} |
[代码]java代码:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class BuildProduct implements IBuild {//生成第一种Product Product p=new Product();//Product是成员变量 @Override public void createUnit1() { //p.u1=... //创建Unit1 } @Override public void createUnit2() { //p.u2=... //创建Unit2 } @Override public void createUnit3() { //p.u3=... //创建Unit3 } @Override public Product composite() { //... //关联Unit1,Unit2,Unit3 return p; //返回Product对象p }} |
[代码]java代码:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class Director { private IBuild build; public Director(IBuild build){ this.build=build; } public Product build(){ build.createUnit1(); build.createUnit2(); build.createUnit3(); return build.composite(); } public static void main(String[] args) { IBuild build=new BuildProduct(); Director direct=new Director(build); Product p=direct.build(); }} |
2、利用Product派生类方法,也可以实现类似的生成功能。
[代码]java代码:
|
1
2
3
|
public class Unit1 {}public class Unit2 {}public class Unit3 {} |
[代码]java代码:
|
01
02
03
04
05
06
07
08
09
10
|
//定义抽象生成器public abstract class Product { Unit1 u1; Unit2 u2; Unit3 u3; abstract void createUnit1(); //表明子类要创建Unit1 abstract void createUnit2(); //表明子类要创建Unit2 abstract void createUnit3(); //表明子类要创建Unit3 abstract void composite(); //表明子类要组合Unit1、Unit2、Unit3} |
[代码]java代码:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//定义具体生成器public class BuildProduct extends Product{ @Override void createUnit1() { } @Override void createUnit2() { } @Override void createUnit3() { } @Override void composite() { }} |
[代码]java代码:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
//定义指挥者类public class Director { Product p; public Director(Product p){ this.p=p; } void build(){ p.createUnit1(); p.createUnit2(); p.createUnit3(); p.composite(); }} |
设计模式Day02的更多相关文章
- IOC设计模式初步了解(day02)
IOC(Inversion of Control):控制反转. *其他解释:依赖注入.依赖反转…… 设计目标:简化JEE的研发工作,提供IOC容器,控制bean的生成.注入,解耦. 看了网上的一些帖子 ...
- 简单的Dao设计模式
简单的DAO设计模式 这两天学习到了DAO(Data Access Object 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
随机推荐
- closest()一个在评论里很有用的函数
实例 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click", fu ...
- 六、mysql字段类型选择
.char类型字段会自动删除字符串后面所带的空格,而varchar不会 .char比varchar快..... .myisam 建议 char类型,memory char跟varchar一样,都作为c ...
- PDF合并
要求:将多个table导出到一个PDF里,然后打印. 问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个exce ...
- MVC学习系列——参考
C#进阶系列——WebApi接口传参不再困惑:传参详解 http://www.cnblogs.com/landeanfen/p/5337072.html
- easy ui 给表单元素赋值input,combobox,numberbox
①给input控件 class="easyui-textbox" <input class="easyui-textbox" data-options=& ...
- linq and rest api in sharepoint
//1.make sure your application using the .net fromwork 3.5 //2.create entity classes using the instr ...
- 元素属性和js数组
arrObj.push(数组元素) --增加arrObj.splice(index,howmany)--删除 一般howmany为1, index,开始截取掉的位置,arrObj[index].P ...
- 对日期和时间的处理 NSCalendar
代码较老,供参考 NSCalendar用于处理时间相关问题.比如比较时间前后.计算日期所的周别等. 1. 创建或初始化可用以下方法 + (id)currentCalendar; 取得当前用户的逻辑日历 ...
- uva 437 hdu 1069
dp 将石块按三个面存入队列 按底面积排序 dp就最大高度 按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...
- JSP中脚本、声明和表达式的本质区别
JSP脚本元素 使用JSP脚本元素可以将Java代码嵌入到JSP页面里,这些Java代码将出现在由当前JSP页面生成的Servlet中,使JSP将静态内容与动态内容分离出来.脚本元素包含: 1. ...