看来Java构造器模式,决定动手体验下。构造器模式是什么?干什么用的?推荐大家看下ITEYE的一篇文章
http://www.iteye.com/topic/71175
了解构造器模式对于系统的重构,也是很有帮助的。例如,可以优化多构造器类的设计。
首先,我先寻找一个应用场景。拿民工和设计师来写固然可以,但觉得有点类似写Hello word的感觉。学习编程语言和设计模式,很多时候只有将学到的东西和实际应用结合起来的时候,才会深入体会,获取精髓。
Effective Java里说,当遇到多个构造器参数时,考虑用构造器模式。里面有个商品的例子。这让我想到了熟悉的学生信息管理系统。
拿研究生来说吧,入学考试后先进行面试和体检,然后是录取,最后是入学分班。这几个阶段对学生的信息需求是不一样的。
我们首先基于以下假设:
1、体检时只需要知道我们的姓名、性别、年龄和身高等信息。
2、录取的时候,需要在体检基本信息的基础上添加院系、年级等信息。
3、入学分班后,需要添加班号(班级编号)等信息。
4、正式开学后,为了便于管理,又需要完善身份证、学号、实验室名称和宿舍地址等信息。
好吧,现在我们动手写这个学生信息管理系统。先要创建一个名为Student的类,为了满足4个阶段创建用户信息的需要
,我们可能需要4个构造函数。
package com.icecode.data;
public class Student {
private String name;
private int age;
private int height;
private int sex; //0表示男性,1表示女性,其它值非法
private String schoolName;
private String profession;
//要求分班的时候,名字相同的同学不能分配到一个班级
private int gradeNo;//年级编号
//扩展信息
private String idCard;//身份证号
private String stuNo;//学号
private String labName;//实验室名称
private String dormitoryAddress;//宿舍地址
/**
* 创建一个基本学生信息 ,例如在研究生入学体检时,不需要专业、年级信息,
* 因此,可以只适用必须的参数创建一个基本信息
* @param name
* @param age
* @param height
* @param sex
*/
public Student(String name, int age, int height, int sex) {
super();
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
}
/**
* 创建一个基本学生信息 ,研究生正式录取后,学校的学生信息管理系统需要学生基本信息
* @param name
* @param age
* @param height
* @param sex
* @param schoolName
* @param profession
*/
public Student(String name, int age, int height, int sex,
String schoolName, String profession) {
super();
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
this.schoolName = schoolName;
this.profession = profession;
}
/**
* 开学了,为了教学方便,学校进行了分班,同时要求在创建分班的时候,
* 要求名字相同不分到同一个班级
* @param name
* @param age
* @param height
* @param sex
* @param schoolName
* @param profession
* @param gradeNo
* @throws Exception
*/
public Student(String name, int age, int height, int sex,
String schoolName, String profession, int gradeNo) throws Exception {
super();
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
this.schoolName = schoolName;
this.profession = profession;
this.gradeNo = gradeNo;
if(isValidStudent() == false)
throw new Exception("不合法的学生信息,同名的学生不能分到同一个班级...");
}
/**
* 学生信息合法性校验
* @return
*/
public boolean isValidStudent(){
boolean flag = true;
//TODO 进行用户信息合法性校验
return flag;
}
public Student(String name, int age, int height, int sex,
String schoolName, String profession, int gradeNo, String idCard,
String stuNo, String labName, String dormitoryAddress) {
super();
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
this.schoolName = schoolName;
this.profession = profession;
this.gradeNo = gradeNo;
this.idCard = idCard;
this.stuNo = stuNo;
this.labName = labName;
this.dormitoryAddress = dormitoryAddress;
}
}
当然,以上这个Student类,可以就创建一个构造器,当然这个构造器必须是参数最多的那个。但是这样,编写体检中心信息管
理的程序员不愿意了,它不愿意使用一个需要这么多参数的构造器,因为对他有用的参数就4个。其它模块的程序可能也不大高兴,
因为他们也不愿意使用这样的构造器。同时,如果学校的某个部门突然提出需要其它一些学生信息,比如说学生的4、6级成绩,这
个看似通用的构造器就不适用了,而且修改该构造器代价很大。其它模块的程序员都得配合。
也许有人会问,为什么不使用JavaBean使用的Set方法呢?这种方法有一个缺陷,因为构造过程被分配到了几个调用中,在构
造过程中JavaBean可能处于不一致状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。(引用:《Effective Java》)
是啊,我们总不能控制类的使用者按照一定顺利来调用不同参数的Set方法,再在最后一个set方法中做校验吧?
所以比较满意的方法是根据大家的需要创建不同的构造器。
这样,当参数不断增多的时候,大家都根据自己的需要创建一个自己的构造器。慢慢的,构造器越来越多,代码变得越来越难
理解。即使有一天,系统的设计者想重新设计这个构造器,也变得异常困难。
当系统的设计者正在为这种需求苦恼的时候,我们发现了Builder模式,好吧,我们现在就想想怎么用Builder模式来解决我们
的需求难题。
试想,哪些信息是必须有的,我们只需要一个基础构造器。其它的信息通过类似JavaBean所使用的Set方法set进去,一样可以
达到我们的目的。具体怎么做?我们先贴出代码吧。
package com.icecode.data;
public class Student {
private final String name;
private final int age;
private final int height;
private final int sex; //0表示男性,1表示女性,其它值非法
private final String schoolName;
private final String profession;
//要求分班的时候,名字相同的同学不能分配到一个班级
private final int gradeNo;//年级编号
//扩展信息
private final String idCard;//身份证号
private final String stuNo;//学号
private final String labName;//实验室名称
private final String dormitoryAddress;//宿舍地址
private Student(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.height = builder.height;
this.sex = builder.sex;
this.schoolName = builder.schoolName;
this.profession = builder.profession;
this.gradeNo = builder.gradeNo;
this.idCard = builder.idCard;
this.stuNo = builder.stuNo;
this.labName = builder.labName;
this.dormitoryAddress = builder.dormitoryAddress;
}
public static class Builder{
private String name;
private int age;
private int height;
private int sex; //0表示男性,1表示女性,其它值非法
private String schoolName;
private String profession;
//要求分班的时候,名字相同的同学不能分配到一个班级
private int gradeNo;//年级编号
//扩展信息
private String idCard;//身份证号
private String stuNo;//学号
private String labName;//实验室名称
private String dormitoryAddress;//宿舍地址
public Builder(String name, int age, int height, int sex) {
super();
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
}
public Builder setSchoolName(String schoolName) {
this.schoolName = schoolName;
return this;
}
public Builder setProfession(String profession) {
this.profession = profession;
return this;
}
public Builder setGradeNo(int gradeNo) {
this.gradeNo = gradeNo;
return this;
}
public Builder setIdCard(String idCard) {
this.idCard = idCard;
return this;
}
public Builder setStuNo(String stuNo) {
this.stuNo = stuNo;
return this;
}
public Builder setLabName(String labName) {
this.labName = labName;
return this;
}
public Builder setDormitoryAddress(String dormitoryAddress) {
this.dormitoryAddress = dormitoryAddress;
return this;
}
//构造器入口
public Student build(){
return new Student(this);
}
}
@Override
public String toString() {
return "Students [name=" + name + ", age=" + age + ", height=" + height
+ ", sex=" + sex + ", schoolName=" + schoolName
+ ", profession=" + profession + ", gradeNo=" + gradeNo + "]";
}
}
测试代码
public class Test {
public static void main(String[] args){
Student stu = new Student.Builder("icecode", 22, 178, 1)
.setSchoolName("BUPT").setProfession("Computer Science and
Technology").
setGradeNo(20091012)
.build();
System.out.println(stu.toString());
}
}
由上看见,使用Builder模式减少了构造器,提供了通用的入口,便于进行合法性校验。前面系统设计中的问题,也迎刃而解了。
当然了,构造器的用途很多,自己只是拿它在多构造器类的重构中的使用来体验。
分享到:
相关推荐
通过Flex的Binding和Observer模式,可以实现Java数据模型与Flex UI的实时同步。 6. **调试和测试**:Flex Builder 4提供了强大的调试工具,可以对ActionScript代码进行断点调试,同时也支持远程调试Java服务。此外...
此外,还有“建造者模式”(Builder Pattern)、“模板方法模式”(Template Method Pattern)、“命令模式”(Command Pattern)、“责任链模式”(Chain of Responsibility Pattern)、“享元模式”(Flyweight ...
PowerBuilder 8.3 是一款历史悠久的开发工具,主要用于构建企业级的应用程序,尤其是在...通过安装光盘压缩文件"PowerBuilder8.3.rar",开发者可以重新体验这款经典工具的魅力,并继续构建稳定、可靠的企业级系统。
4. **建造者模式(Builder)**:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 5. **原型模式(Prototype)**:通过复制已有对象来创建新对象,避免重复初始化过程。 6. **适配器...
在本教程中,我们将深入探讨如何使用Flash Builder...这个过程中,不仅涉及到Flex客户端的AMF通信,还包括Java后端的JPA实体映射、DAO设计模式以及服务暴露和配置。学习和掌握这些技术将极大地提升开发效率和应用质量。
在Android开发过程中,为了提高...总的来说,这款插件是Android开发者提升工作效率的利器,它将Builder模式与自动化结合,减少了手动编写重复代码的时间,使开发者能够更加专注于业务逻辑的实现,提升整体的开发体验。
5. 集成开发环境:Scene Builder可与Eclipse、IntelliJ IDEA等主流Java IDE无缝集成,进一步提高开发效率。 四、使用场景与最佳实践 1. 教育培训:对于初学者来说,Scene Builder是理解JavaFX UI设计的绝佳工具,...
Builder模式是一种创建型设计模式,常用于对象实例化过程的复杂性管理,使得创建过程更加清晰,易于维护。这款插件通过自动化生成这一模式,大大减少了手动编码的工作量,提高了代码质量。 二、主要功能 1. 自动化...
PowerBuilder可以与其他系统进行接口集成,如通过COM/ActiveX组件与.NET或Java应用交互,或者使用Web服务接口与外部系统通信。 10. 实例分析与实战项目: 结合实例学习是最好的教学方式。通过完成实际项目,如...
### PowerBuilder:数据库应用开发的全能工具 ...综上所述,PowerBuilder 9.0凭借其对现代技术和开发模式的深度集成,以及其核心优势,成为了数据库应用开发领域的佼佼者,为开发者提供了强大、灵活且高效的开发体验。
5. **数据库连接**:PowerBuilder支持多种数据库,包括Oracle、SQL Server、MySQL等,通过ODBC(Open Database Connectivity)或JDBC(Java Database Connectivity)接口,方便地建立和管理数据库连接。 6. **网络...
Java Flex入门实例主要涉及到的是Java和Adobe Flex的集成开发,这是一种常见的富互联网应用程序(Rich Internet Application,RIA)开发模式。Flex是基于ActionScript和Flash Player技术的开发框架,用于构建具有...
WindowBuilder for Eclipse 4.4 是一款强大的图形化开发工具,专为Eclipse IDE的4.4版本设计,极大地简化了Java GUI(图形用户界面)应用程序的开发过程。这款插件允许开发者通过拖放的方式创建和编辑用户界面,显著...
4. **Android API集成**:C++ Builder通过JNI(Java Native Interface)与Android API交互,允许开发者调用Android系统的原生功能,如传感器、GPS、多媒体等。 5. **事件驱动编程**:在Android开发中,事件驱动编程...
- **挑战**:Flex Builder 面临的最大挑战来自于盈利模式。它采取了类似于Borland 公司推出的JBuilder 的收费模式,这在面对免费的开源IDE Eclipse 时显得竞争力不足。历史上,JBuilder 就是因为Eclipse 的崛起而...
- **Messaging**: BlazeDS还提供了消息传递功能,允许Flex客户端和Java后台通过Topic发布/订阅模式进行异步通信。 5. **调试与测试** - **Flex调试器**: 利用Flash Builder的内置调试工具,可以调试Flex客户端...
Java 课程教学可以采取一些新的教学模式,例如体验式教学、案例教学、项目驱动等。这些新的教学模式可以提高学生的实践能力和应用能力。例如,在教学过程中,教师可以使用项目驱动的教学模式,让学生参与实际的项目...
总的来说,这个Java房产管理系统项目为学习者提供了一个宝贵的实践平台,涵盖了Java开发的多个方面,包括但不限于MVC设计模式、GUI设计、数据库操作、源码阅读与分析等。通过研究这个项目,学习者不仅可以提升自己的...