在类结构中每当使用关键字new都会调用构造方法并实例化新的对象,然而在设计中,也可以利用构造方法的私有化形式来实现实例化对象的控制。
10.3.1单例设计模式
单例设计模式是指在整个系统中一个类只允许提供一个实例化对象,为实现此要求就可以通过private进行构造方法的封装,这样该类将无法在类的外部利用关键字new实例化新的对象,同时为了方便使用本类的方法。则可以在内部提供一个全局实例化对象供用户使用。
范例:单例设计模式
package com.lxh.tenchapter;
public class SingIeton {
//在类内部进行Singleton对象实例化,为了防止可能出现重复实例化所以使用final标记
private static final SingIeton INSTANCE=new SingIeton();
private SingIeton(){} //构造方法私有化,外部无法通过关键字new实例化
/**
* 获取本类实例化对象方法,static方法可以不受实例化对象的限制进行调用
* @return INSTANCE内部实例化对象,不管调用多好次此方法都只返回同一个实例化对象
*/
public static SingIeton getInstance() {
return INSTANCE;
}
public void print() {
System.out.println("520");
}
}
package com.lxh.tenchapter;
public class Java232 {
//在外部不管有多少个SingIeton类对象,实质上最终都只调用唯一的一个SingIeton类实例
public static void main(String[] args) {
SingIeton inst=SingIeton.getInstance();
inst.print();
}
}
执行结果520
本程序将 SingIeton类的构造方法进行了private私有化封装,这样将无法在类的外部通过关键字new实例化本类对象。同时为了方便使用SingIeton类对象,在类内部提供了公共的INSTANC对象作为本类成员属性,并利用static方法可以直接获取本类实例以实现相关方法调用。
单例设计模式分为两种:饿汉式单例设计和懒汉式单例设计。
饿汉式单例设计:类中定义成员属性时就直接进行了对象实例化处理。
懒汉式单例设计:第一次使用类的时候才会进行对象实例化。
范例:定义懒汉式单例设计模式
package cn.mldn.demo;
class Singleton { // 单例程序类
// 定义公共的instance属性,由于需要在第一次使用时实例化,所以无法通过关键字final定义
private static Singleton instance; / 声明本类对象
private Singleton() {}// 构造方法私有化,外部无法通过关键字new实例化
/**
* 获取本类实例化对象方法,static方法可以不受实例化对象的限制进行调用
* @return 返回唯一的一个Singleton类的实例化对象
*/
public static Singleton getInstance() {
if (instance == null) { // 第一次使用时对象未实例化
instance = new Singleton() ; // 实例化对象
}
return instance ; // 返回实例化对象
}
public void print() {// 信息输出
System.out.println("www.mldn.cn");
}
}
public class JavaDemo {
public static void main(String args[]) {
// 在外部不管有多少个Singleton类对象,实质上最终都只调用唯一的一个Singleton类实例
Singleton instance = null; // 声明对象
instance = Singleton.getInstance(); // 获取实例化对象
instance.print(); // 通过实例化对象调用方法
}
}
本程序在 SingIeton 类内部定义instance成员属性时并没有进行对象实例化,而是在第一次调用getInstance()方法时才进行了对象实例化操作,这样可以节约程序启动时的资源。
10.3.2多例设计模式
单例设计模式只留有一个类的实例化对象,而多例设计模式会定义出多个对象,例如定义一个表示星期的操作类,这个类的对象有7个实例化对象;定义一个表示性别的类有两个实例化对象;类似这样的类就不因该由用户无限制的创造实例化对象,应该只使用有限的几个,这个就属于多例设计模式。
范例:实现多例设计模式
package com.lxh.tenchapter;
public class Color { //多例设计模式
private static final Color RED=new Color("红色");
private static final Color GREEN=new Color("绿色");
private static final Color BLUE=new Color("蓝色");
private String title;
private Color(String title) {
this.title=title;
}
public static Color getInfo(String c) {
switch(c) {
case "red":
return RED;
case "green":
return GREEN;
case "blue":
return BLUE;
default:
return null;
}
}
@Override
public String toString() {
return "Color [title=" + title + "]";
}
}
package com.lxh.tenchapter;
public class java234 {
public static void main(String[] args) {
Color c=Color.getInfo("green");
System.out.println(c);
}
}
执行结果:Color [title=绿色]
由于需要控制实例化对象的产生个数,所以本程序将构造方法进行私有化定义后在内部提供了3个实例化对象,为了方便外部类使用,可以通过getInfo()方法利用对象标记获取实例化对象。