`
guafei
  • 浏览: 323240 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
多种设计模式能够解决普通构造器不能解决的问题。
1.普通构造的挑战:
  突破题1:请列出Java构造器关于使用和行为的4条规则。
  答:(1)如果开发者没有为类提供构造器,那么Java将会为该类提供默认的构造器.
       (2)构造器的名字必须与类名相同。因而,构造器名字通常与其他方法名字不同,它的名字是以大写字母开头。这一点看起来有些怪异。
       (3)构造器可以使用this()方法和super()方法来调用其他构造器,但对this()和super()方法的调用必须是该构造器的第一条语句。
       (4)构造器执行结果会得到该类的一个实例,而常规方法的返回类型不受限制。
       (5)使用new或者反射来调用构造器。

  Java构造器除了会在没有显性声明构造器时提供一个默认的构造器之外,第2个默认提供的内容是,如果构造器声明没有使用this()或者super() 来显性地调用其他构造器,Java会自动添加不带参数的super()。这样做也许会带来意想不到的结果,比如下列代码将导致编译错误:
package app.construction;
public class Fuse
{
private String name;
public Fuse(String name) { this.name = name;}
}

以及如下代码:
package app.construction;
public class QuickFuse extends Fuse
{
}

编译器会报错,错误类似于:
QuickFuse.java:2: 找不到符号
符号: 构造函数 Fuse()
位置: 类 app.construction.Fuse
public class QuickFuse extends Fuse
       ^
1 错误

    当编译器遇到QuickFuse类时会报错,并为之提供一个默认构造器。默认构造器没有参数,也会不带参数调用超类的构造器。然而,接收String对象 参数的Fuse()构造器意味着编译器不再为Fuse类提供默认的构造器。QuickFuse的默认构造器不能调用没有参数的超类构造器,因为这个构造器 是不存在的。

    实例化对象的最常见方法是调用new操作符,但也可以使用反射(reflection)。反射允许将类型和类型成员作为对象使用。即使不经常使用反射,你也能够按照现成的程序来使用反射。下面就是一个例子:
package app.construction;
import java.awt.Point;
import java.lang.reflect.Constructor;
public class ShowReflection
{
     public static void main(String[] args)
     {
          Constructor[] cc = Point.class.getConstructors();
          Constructor cons = null;
          for(int i=0;i<cc.length;i++)
               if(cc[i].getParameterTypes().length == 2)
                   cons = cc[i];
          try
          {
               Object obj = cons.newInstance(new Object[] {new Integer(3),new Integer(4)});
          }catch(Exception e)
          {
               System.out.println("Exception : " + e.getMessage());
          }
     }
}

输出结果如下:
java.awt.Point[x=3,y=4]

我们成功地发现了具有两个参数的构造器,并使用其提供的参数创建一个新的点。

2. 小结:
   通常我们需要为自己开发的类提供构造器用于类的实例化。一个类的构造器之间可能会相互调用,从而相互合作完成初始化工作。类的每个构造器最终都会调用其超类的构造器。常见方式是使用new操作符来调用构造器,但是你也可以使用反射来实例化和使用对象。

3.超载普通构造:
  当我们设计新类时,Java构造器提供的种种特征可为我们提供很多选择。然而,使用构造器进行类的实例化要求我们必须事先知道需要实例化哪个类,以及实例 化的时候需要提供哪些参数。例如,在选择图形用户界面组件时,我们必须考虑该应用程序是运行在手持设备上,还是运行在大型显示设备上。另外,有时候虽然开 发人员知道该实例化哪个类,但他们并不知道必须提供哪些初始参数,或者知道需要哪些参数,但是不知道该使用什么样的格式。例如,开发人员可能需要根据对象 的休眠版本或文本版本构造出该对象。在上述这些情况下,普通的Java构造器是无法解决问题的,因而我们需要使用设计模式。

  下面分别描述了每种构造型模式的设计目的:

         如果你期望                              可应用模式
在构造对象之前逐步收集该对象与构造相关的信息 Builder模式
推迟确定所需要实例化的类 Factory Method模式
构造一系列具有某个公共特性的对象 Abstract Factory模式
根据给定的例子创建一个对象 Prototype模式
根据只包含对象内部状态的休眠版本来重新构造对象 Memento模式

   每种设计模式都有自己不同的应用场合。面向构造的设计模式可以使得客户代码能够在无需调用类的构造器的前提下构建一个新的对象。例如,当我们需要逐步获得构建一个对象所需的初始参数值的时候,可以应用生成器模式。





一、概述
      构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来,使得同样的构建过程可以创建不同的表示,又称为生成器模式。
    在软件系统 中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变 化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定 构建算法”不随着需求改变而改变?
      如果我们使用了构造者模式,那么用户就只需要指定需要构造的类型就可以得到它们,而具体的构造过程和细节就不需要知道了。
二、类图和图解
   

三、构造者模式解析
    Builder:是为创建一个Product对象的各个部件指定的抽象接口
    ConcreteBuilder:它是具体的构建者,实现Builder接口,构造和装配各个部件。
    Product:具体的产品
    Director:指挥者,它是构建一个使用Builder接口的对象。

四、实例代码

//产品类:
package com.javapatterns.builder;

public class Product{
    public Product(){
       // System.out.println("product is initing.");
    }
}
//抽象建造方法:
package com.javapatterns.builder;

abstract public class Builder{
    public abstract void buildPart1();

    public abstract void buildPart2();

    public abstract Product retrieveResult();
}
//具体的建造类:产品的零件制造
package com.javapatterns.builder;

public class ConcreteBuilder extends Builder{

    private Product product = new Product() ;
    public void buildPart1(){
        System.out.println("build part one.");
    }

    public void buildPart2(){
        System.out.println("build part two.");
    }

    public Product retrieveResult(){
        return product;
    }
}


//产品的建造过程:
package com.javapatterns.builder;

public class Director{
    private Builder builder;

    public Director(Builder builder){
        this.builder = builder;
    }

   public void construct(){
        builder = new ConcreteBuilder();

        builder.buildPart1();

        builder.buildPart2();

        builder.retrieveResult();

        //continue with other code
    }
}


//测试:
package com.javapatterns.builder;

public class Client{

    private static Director director;

    private static Builder builder = new ConcreteBuilder();
      
    public void requestBuild(){
       // director = new Director(builder);
    }
  
     public static void main(String[] args) {
        director = new Director(builder);
        director.construct();
    }

}



一, 一般来说你要做一件复杂的事情的时候,把它分成多个小的部分来做是比较好的方法,
把每个小部分做完,然后结合成一个完整的事情。例如生产一辆汽车,你是一个个零件
生产完了,才组装成一辆辆汽车。这个就是建造模式的工作。
二,建造模式的角色
1、抽象建造者
2、具体构造者
3、导演者
4、产品角色
三、实现代码 :
与上述代码相似
分享到:
评论

相关推荐

    java_构造者模式

    本人用java写的构造者模式的小demo,源码里有详细的注释,保证一看就懂。欢迎交流指点。

    设计模式专题之(四)建造者模式---设计模式建造者模式示例代码(python--c++)

    设计模式专题之(四)建造者模式---设计模式建造者模式示例代码(python--c++)

    【设计模式】(八)–创建型模式–建造者模式

    建造者模式【设计模式】(八)–创建型模式–建造者模式建造者模式定义构造者模式的优点构造者模式的使用场景构造者模式和工厂模式区别构造者模式简单实现 建造者模式定义 Separate the construction of a complex ...

    自定义构建者dialog.rar

    自定义构建者dialog.rar

    SSM模式中式快餐企业供应管理系统毕业设计程序

    采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...

    46丨建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式1

    46 | 建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式2020-02-17 王争设计模式之美进入课程讲述:冯永吉时长 10:31大小 8.4

    Java运用设计模式中的建造者模式构建项目的实例解析

    主要介绍了Java运用设计模式中的建造者模式构建项目的实例解析,建造者模式对外隐藏创建过程的产品,使用组合的方式,由指挥者来决定建造的流程,需要的朋友可以参考下

    C# 设计模式-建造者模式

    设计模式-建造者模式,该模式涉及产品,构造者,指挥者、调用者等几个角色,职责明确,在实际项目中使用得比较多。

    java设计模式

    第36章 观察者模式+中介者模式 36.1 事件触发器的开发 36.2 混编小结 第37章 规格模式 37.1 规格模式的实现 37.2 最佳实践 第38章 MVC框架 38.1 MVC框架的实现 38.1.1 MVC的系统架构 38.1.2 模型管理器 38.1.3 值栈 ...

    Python实现的建造者模式示例

    主要介绍了Python实现的建造者模式,结合完整实例形式分析了构造者模式的具体定义与相关使用操作技巧,需要的朋友可以参考下

    JavaScript模式中文[pdf] 百度云

     装饰者模式  策略模式  外观模式  代理模式  中介者模式  观察者模式  小结  第8章 DOM和浏览器模式  关注分离  DOM脚本  事件  长期运行脚本  远程脚本  配置JavaScript  载入策略

    Delphi模式编程第一分卷

    6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) 7.1 模式解说 7.2 结构和用法 7.2.1 模式结构 7.2.2 代码模板 7.2.3 Delphi对象构造机制与单例模式 7.3 范例与实践 ...

    Delphi模式编程第二分卷

    6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) 7.1 模式解说 7.2 结构和用法 7.2.1 模式结构 7.2.2 代码模板 7.2.3 Delphi对象构造机制与单例模式 7.3 范例与...

    自定义持久层框架之MyBatis.zip

    无聊时写着玩之徒手撸自定义持久层MyBatis...将会涉及到的一些知识点:工厂模式(Factory工厂模式)、构造者模式(Builder模式)、代理模式,反射,自定义注解,注解的反射,xml解析, 数据库元数据,元数据的反射等。

    construction-conduction

    制造者模式和构造者模式的区别 “this”关键字的作用是什么并且能够使用它 'new' 关键字的作用以及当使用 'new' 关键字调用函数时 JavaScript 编译器的作用 JavaScript 中的原型是什么,并且能够在函数原型上添加...

    ConstructorConductor

    实例数组.js 名称.js 数组属性.js 测验应用程序.js学习目标制造者模式和构造者模式的区别“this”关键字的作用是什么并且能够使用它'new' 关键字的作用以及当使用 'new' 关键字调用函数时 JavaScript 编译器的作用...

    第7章_建造者模式.ppt

    而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的...

Global site tag (gtag.js) - Google Analytics