设计模式—详解篇—创建型模式
1. 在java程序中,对象可以被显式地或者隐式地创建?
1.1显式的创建对象的方式
A.用new语句创建对象
B.运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实
例方法
C.调用对象的clone()方法
D.运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.
1.2隐式建对象的方式
A. String a= "hello";这种属于String类型直接对应一个String对象,引用一个String对象。若此时运行String b="hello";则a和b是同一个对象。
B. String中+的使用。
C. JVM加载一个类的时候,会隐含创建描述这个类的Class实例。
2.显示创建中各种方式的用途及优缺点?
2.1用new语句创建对象:
如果构造方法中有参数,当使用这种方式写程序时不利于扩展参数,扩展时会导致多出修改
2.2运用反射手段
此方法可以帮助减少if-else语句
2.3 clone方法
对应了创建型模式的prototype模式,用于克隆一个具有同样属性的对象出来
注意深度clone的实现
2.4运用序列化手段
还没使用过
3. 根据对象的复杂性使用不同的设计模式渐进的实现对象的构造?
3.1Singleton模式
保证一个类仅有一个实例,应提供一个访问它的全局访问点
有些对象是需要计划生育的,如太阳。
Singleton的实现方式有饿汉式和懒汉式两种
饿汉式代码:
public class Sun{
private static final Sun uniqueInstance=new Sun();
private Sun(){}
public static Sun getInstance(){
return uniqueInstance;
}
}
懒汉式代码:
public class Sun{
private static Sun uniqueInstance;
private Sun(){}
public static Sun getInstance(){
if( uniqueInstance==null){
synchronized(Sun.class){
if(uniqueInstance==null){
uniqueInstance=new Sun();
}
}
}
return uniqueInstance;
}
}
3.2 prototype原型模式(clone)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
有时创建的对象要求和已有对象完全一样,如个人简历
此模式分为浅复制和深复制
浅复制:复制出的对象的所有原型变量都与原来的对象具有相同的值,而所有的其他对象引用的变量都仍然指向原来的对象。
public class Resume implements Cloneable {
private String name;
private int age;
@Override
public Resume clone() throws CloneNotSupportedException {
Resume message = (Resume) super.clone();
return message;
}
}
深复制:将对象中的引用型变量也复制出来
public class Resume implements Cloneable {
private User user;
@Override
public Resume clone() throws CloneNotSupportedException {
Resume message = (Resume) super.clone();
if (this.user != null) {
message.user = this.user.clone();
}
return message;
}
}
3.3 Factory工厂模式
此模式又分为三个子模式:简单工厂模式、工厂方法模式、抽象工厂模式。他们因要创造的对象的复杂程度不同而渐进变化。
简单工厂模式:这好比个人的作坊,生产的产品比较简单
生产苹果的例子
public class AppleFactory {
public static Apple getApple() {
Apple apple = new Apple();
return apple;
}
private AppleFactory() {
}
}
工厂方法:此时生产的为统一接口且不同实现的产品。工厂有个接口,生产的产品也有个接口,每种具体的产品对应一个具体工厂
抽象工厂:此时生产的产品为相互依赖的、有一定关联的多种产品。工厂有个接口,每个工厂都对应生产出这些相互依赖的产品。
3.4 Builder建造者模式
此模式创造的是一个复杂的对象,达到对象的构建与它的表示相分离,使得同样的
构建过程可以创建出不同的表示。
看图说话:
模式中有个指挥员,指挥具体的建造者建超产品,最有建造者通过getResult() 获取产品