单例/多例设计模式和枚举

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方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值