`
xyheqhd888
  • 浏览: 402760 次
  • 性别: 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模式

 

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

 

分享到:
评论

相关推荐

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163...

    论文研究-基于仿生模式识别的构造型神经网络分类方法.pdf

    从BP神经元模型和RBF神经元模型几何意义出发,将仿生模式识别理论引入到神经网络分类中,提出了一种基于仿生模式识别的构造型神经网络分类方法,通过构造不同结构神经元结合的神经网络,实现了对不同类样本在高维...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造者模式10 1.1.4 单态模式13 1.1.5 原型模式15 1.2 构造型模式17 1.2.1 适配器模式17 1.2.2 桥接模式19 1.2.3 组合模式23 1.2.4 装饰模式26 ...

    UML和模式应用(架构师必备).part02.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part06.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    《领域特定语言》(Martin Fowler,Domain-Specific Languages)迷你书

    第二部分介绍了各种DSL,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、BNF、易于正则表达式表的词法分析器、递归下降法词法...

    领域特定语言

    第二部分介绍了各种DSL,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、BNF、易于正则表达式表的词法分析器、递归下降法词法...

    领域特定语言(Domain Specific Languages)

    第二部分介绍了各种dsl,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、bnf、易于正则表达式表的词法分析器、递归下降法词法...

    UML和模式应用(架构师必备).part01.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part07.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part03.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part04.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part08.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML和模式应用(架构师必备).part05.rar

    16.8 构造型、简档和标记 16.9 UML特性和特性字符串 16.10 泛化、抽象类、抽象操作 16.11 依赖 16.12 接口 16.13 组合优于聚合 16.14 约束 16.15 限定关联 16.16 关联类 16.17 单实例类 16.18 模板类和...

    UML基础、案例与应用(第三版)].施穆勒.扫描版_2分.pdf

    1.4.2 关键字和构造型 12 1.5 UML 2.0中的新图 13 1.5.1 组成结构图 13 1.5.2 交互纵览图 14 1.5.3 计时图 15 1.5.4 有创新也有保留的包图 15 1.6 为什么需要这么多种图 16 1.7 这不仅仅是一系列图 16 1.8 小结 17 ...

Global site tag (gtag.js) - Google Analytics