1 单例设计模式
特点:构造方法私有化,类内部提供static方法获取实例化对象。
饿汉式:在定义时直接生成一个实例化对象。通过private static final
修饰。
package cn.mldn.demo;
class Singleton { // 单例程序类
// 在类内部进行Single类对象实例化,为了防止可能出现重复实例化所以使用final标记
private static final Singleton INSTANCE = new Singleton();
private Singleton() {} // 构造方法私有化,外部无法通过关键字new实例化
/**
* 获取本类实例化对象方法,static方法可以不受实例化对象的限制进行调用
* @return INSTANCE内部实例化对象,不管调用多少次此方法都只返回同一个实例化对象
*/
public static Singleton getInstance() {
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();// 通过实例化对象调用方法
}
}
懒汉式:只有使用时才动态生成一个实例化对象。(后期需要考虑线程同步的问题),通过private 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(); // 通过实例化对象调用方法
}
}
2 多例设计模式
与单例基本一致,只不过在类定义时定义多个私有属性。枚举属于多例设计模式,有了枚举之后就很少用多例设计了。
3 枚举
枚举等价于多例模式,其自动实现了构造方法,toString方法,getInstance()方法。
上面的程序等价于:
public class Color{
public static final Color RED = new Color("红色");
public static final Color GREEN = new Color("绿色");
public static final Color BLUE = new Color("蓝色");
...
}
3.1 枚举接口
枚举类默认继承了Enum类。要想继承其他的类,就必须实现接口。
枚举实现接口可以为每个公共成员实现接口的方法。
enum Color implements IShow{
RED{
public void show(){
System.ouot.println("这是红色");
}
},BLUE{
public void show(){
System.ouot.println("这是蓝色");
}
}, GREEN{
public void show(){
System.ouot.println("这是绿色");
}
}
}
interface IShow{
void show();
}
3.2 注意事项
- 一旦定义了枚举,轻易不要修改里面的内容,除非是必要的
- 枚举类型默认继承java.lang.Enum而不是java.lang.Object
- 枚举类不能有子类(因为是final修饰)
- 只能有private构造方法
- switch使用枚举时,直接使用常量名,不用携带类名
- 不能定义name属性,因为自带name属性
- 不要在枚举类中设置setter方法