设计模式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 抽象访问者角色,为该 ...
随机推荐
- Memcache 分布式解决方案 之 : 普通 Hash 分布
<?php /* mhash * 其实说白了,就是为了实现返回0或1 */ function mmhash($key){ $md5 = substr(md5($key),0,8);//取该字符串 ...
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...
- 【BZOJ 1053】[HAOI2007]反素数ant
Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1 ...
- javascript高级编程笔记06(面相对象2)
1) 构造函数模式 es中的构造函数可以用来创建特定类型的对象,像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中,此外,也可以创建自定义的构造函数,从而定义自定义对象类型 ...
- 我又回来了,这回是带着C++来的
一晃就是5年,之前在博客园开这个博客主要是跟着大牛学习C#,那个时候自己偏重于asp.net,后来开发了一段时间的Winform.近几年由于工作原因,偏重于测试仪器开发,属于工控行业,主要使用的是C+ ...
- ionic修改loading背景色
.loading{ background-color: #387ef5 !important; } 只需要在自定义css文件中设置即可
- CROSS APPLY vs OUTER APPLY
Apply 工作原理: Apply操作符让符合查询的每一条记录都调用一次TVF函数,并将结果与原数据表的记录内容一起展开. Apply操作符定义在From子句内,使用方式与Join操作符类 ...
- Objective C 四舍五入,float处理
NSLog(@"平方:%.f", pow(3,2) ); //result 9 NSLog(@"上舍入:%.f", ceil(3.000000000001)); ...
- Java在mysql插入数据的时候的乱码问题解决
今天在使用hibernate的时候,插入mysql的数据中的中文总是显示乱码,之前出现过类似的问题,但是没有太在意,今天又发生了.所以向彻底的解决一下. 参考的博文: http://www.cnblo ...
- 【分块】bzoj3343: 教主的魔法
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 631 Solved: 272[Submit][Status][Discuss ...