本文介绍5其余两种创意模式:模型构建器(Builder)、原型模型(PROTOTYPE)。

一、建造者模式(别名:生成者模式)

将复杂对象的构建和它的表示分离,使得相同的构建过程能够创建不同的表示。

一个完整的建造者模式包括下面几个概念:

1、产品类 Product

public class Person {

    private String head;

    private String body;

    private String foot;

    public String getHead() {
return head;
} public void setHead(String head) {
this.head = head;
} public String getBody() {
return body;
} public void setBody(String body) {
this.body = body;
} public String getFoot() {
return foot;
} public void setFoot(String foot) {
this.foot = foot;
}
}

2、抽象建造者builder

public interface PersonBuilder {

    void buildHead();

    void buildBody();

    void buildFoot();

    Person buildPerson();
}

3、详细建造者ConcreteBuilder

public class ManBuilder implements PersonBuilder {

    Person person;

    public ManBuilder() {
person = new Man();
} public void buildbody() {
person.setBody("建造男人的身体");
} public void buildFoot() {
person.setFoot("建造男人的脚");
} public void buildHead() {
person.setHead("建造男人的头");
} public Person buildPerson() {
reture person;
}
}

假设有多个详细的产品就有多个详细建造者,这些详细建造者实现共同的接口。

比方像建造女人,就再定义WomanBuilder。

4、导演类Director,起到封装作用,避免高层模块深入到建造者内部的实现。

假设建造者比較复杂需多个导演类。

public class PersonDirector {

    public Person constructPerson(PersonBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}

測试代码:

public class Test{

    public static void main(String[] ar*s) {
PersonDirector pd = new PersonDirector();
Person person = pd.constructPerson(new ManBuilder());
System*out.println(person.getBody());
System.out.println(person.getFoot());
System.out.println(person.getHead());
}
}

有用范围:

1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须同意被构造的对象有不同的表示时。

备注:说白了建造者模式就是为了建造一个对象,须要运行通用的流程。运行流程时依据须要创造不同的对象封装到详细Builder里。

为了获得终于的对象,仅仅需往导演类里传入相应的详细的Builder就可以。

參考链接:http://www.cnblogs.com/muzongyan/archive/2010/08/27/1810307.html

二、原型模式

目的是为了克隆一个现有的对象。而无需new()就能完毕对象的创建。

克隆对象时又分为浅拷贝和深拷贝。

浅拷贝出来的对象和原来的对象内存地址一样,仅仅是拷贝了地址。深拷贝出来的对象和原对象内存地址不同。所需过程例如以下:

1、声明一个克隆自身的接口 Cloneable

public class Prototype implements Cloneable {

    private String name;

    public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
} public Object clone(){
try {
return super.clone();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

2、详细的原型

publ*c class ConcretePrototype extend* Prototype {

    public ConcretePrototype(String name) {
setName(name);
}
}

測试代码:

public clas* Test {

    public static void main(String[] args) {
Prototype pro = new ConcretePrototy*e("prototype");
Prototype pro2 = (Prototype)pro.clone();
*ystem.out.println(pro.getName()*;
System.out.println(pro2.getName());
}
}

适用性:

1.当一个系统应该独立于它的产品创*、构成和表示时。

2.当要实例化的类是在运行时刻指定时,比如。通过动态装载。
3.为了避免创建一个与产品类层次平行的工厂*层次时。
4.当一个类的实例仅仅能有几个不同状态组合中的一种时。
    建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

总之。原始模型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出很多其它同类型的对象。 原始模型模式同意动态的添加或降低产品类,产品类不须要非得有不论什么事先确定的等级结构。原始模型模式适用于不论什么的等级结构。缺点是每 一个类都必须配备一个克隆方法。深入理解參见链接1 链接2

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java经典23创意模式设计模式(两)的更多相关文章

  1. Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

    本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...

  2. java的23中设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  3. Java经典23种设计模式之创造型模式(一)

    设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计 ...

  4. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  5. Java经典23种设计模式之行为型模式(三)

    本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态.这样以后就能够将该对象恢复到原先保存的状 ...

  6. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  7. Java开发23中设计模式

    设计模式(Design Patterns) 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结.使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性.毫无疑问 ...

  8. Java常见23中设计模式之【代理模式】

    一.静态代理模式 静态代理,使用继承的方式实现自己新增的服务 这种模式可以实现帮助被代理者完成一些前期的准备工作和后期的善后工作,但是核心的业务逻辑仍然是由被代理者完成. 在某些情况下,一个客户不想或 ...

  9. java开发中的23中设计模式详解--大话设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. docker 真实---安装基本映像 (一)

    浸泡了几天的官方网站,正确docker有了更好的理解.准备着手建立一个公司的开发和测试环境,包含java.python. 环境介绍 首先说明一下我的环境 2物理server(以后简称为主机) 主机A配 ...

  2. UVA 12206 - Stammering Aliens(后缀数组)

    UVA 12206 - Stammering Aliens 题目链接 题意:给定一个序列,求出出现次数大于m,长度最长的子串的最大下标 思路:后缀数组.搞出height数组后,利用二分去查找就可以 这 ...

  3. 【BZOJ1791】【IOI2008】【基环树】island(status第一速度)

      1791: [Ioi2008]Island 岛屿  Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 908  Solved: 159 [Su ...

  4. Raw-OS互斥的源代码分析的量的Mutex

    作为分析的内核版本2014-04-15,基于1.05正式版.blogs我们会跟上的内核开发进度的最新版本,如果出现源代码的目光"???"的话,没有深究的部分是理解. Raw-OS官 ...

  5. 照片教你eclipse通过使用gradle 打包Android

    gradle其他优点不说,在android当应用程序公布.假设你要算一些渠道,gradle 在节目包装散装优势:下面给大家介绍的图形 按eclipse当出口 选择Android:例如下面的附图 一步一 ...

  6. capturing self strongly in this block is likely to lead to a retain cycle

    一个用Block实例变量语法,当有一个参考的实例变量,常引起retain cycle. capturing self strongly in this block is likely to lead ...

  7. 十依据一个有用的算法来找到最小(最大)的k的数量-线性搜索算法

    例如:进入1.2.3,4,5,6.7.8此8数字,最小的4图的1,2,3,4. 思路1:最easy想到的方法:先对这个序列从小到大排序.然后输出前面的最小的k个数就可以.假设选择高速排序法来进行排序, ...

  8. linux 字符界面浏览器 w3m(转)

    最近找到了几个linux终端下使用的浏览器,主要用来测试本机web服务器是否搭建成功.因为我们一般是用ssh客户端连接linux的,所以很需要一个字符界面的浏览器.找了几个显示都不理想,只有w3m用起 ...

  9. bzoj 2109 & 2535 空中管制 解读

    [] [分析]小猪真的是一个很好的问题.我认为这是一个问题洪水.建立拓扑后(便! ).直接把最外层设定序号为1,第二层为2.bfs下去就可以. . . 结果发现:飞行序号不能同样.. . 于是開始想. ...

  10. 如何关闭CBox(2.4版本号)强制升级的形式

    从今天开始2.4.0.9版本号CBox,提示检测到新的版本号,能够使用后必须更新为新版本号,提示表见下面的例子. 此次升级是强制升级.假如你选择不升级(单击窗体上的升级提示右下角"辍学but ...