Java学习:单例模式
- 定义
实现1个类只有1个实例化对象 ,即提供一个全局访问点
- 主要作用
保证1个类只有1个对象,降低对象之间的耦合度
- 基本组成
- 实现步骤
- 创建私有变量 singInstance(用以记录 Singleton 的唯一实例)
- 内部进行实例化
- 把类的构造方法私有化,不让外部调用构造方法实例化
- 定义公有方法提供该类的全局唯一访问点
- 外部通过调用getInstance()方法来返回唯一的实例
- 实例
假如只有一个游戏库,很多人都只能对它进行操作
// 单例仓库类
class StoreHouse {
// 仓库游戏数
private int gameNum = 100;
// 自己在内部实例化
private static StoreHouse singInstance = new StoreHouse();
// 构造方法私有化
private StoreHouse() {
}
// 定义公有方法提供该类的全局唯一访问点
// 让外部通过调用getInstance()方法来返回唯一的实例。
public static StoreHouse getInstance() {
return singInstance;
}
public void setQuantity(int gameNum) {
this.gameNum = gameNum;
}
public int getQuantity() {
return gameNum;
}
}
// 玩家类
public class Player {
public StoreHouse myStoreHouse;
public Player(StoreHouse myStoreHouse){
this.myStoreHouse = myStoreHouse;
}
// 存入仓库
public void MoveIn(int i){
myStoreHouse.setQuantity(myStoreHouse.getQuantity()+i);
}
// 搬出仓库
public void MoveOut(int i){
myStoreHouse.setQuantity(myStoreHouse.getQuantity()-i);
}
}
// 测试单例类
public class TestSingleton {
public static void main(String[] args){
StoreHouse myStoreHouse1 = StoreHouse.getInstance();
StoreHouse myStoreHouse2 = StoreHouse.getInstance();
Player Player1 = new Player(myStoreHouse1);
Player Player2 = new Player(myStoreHouse2);
System.out.println("两个是不是同一个?");
if(myStoreHouse1.equals(myStoreHouse2)){
System.out.println("是同一个");
}else {
System.out.println("不是同一个");
}
// 玩家清理仓库之后出来汇报库存
Player1.MoveIn(2);
System.out.println("仓库游戏余量:"+Player1.myStoreHouse.getQuantity());
Player2.MoveOut(5);
System.out.println("仓库游戏余量:"+Player2.myStoreHouse.getQuantity());
}
}
结果:
小结:
- 提供了对唯一实例的受控访问;
- 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能;
- 单例类的职责过重,里面的代码可能会过于复杂,在一定程度上违背了“单一职责原则”;
- 如果实例化的对象长时间不被利用,会被系统认为是垃圾而被回收,这将导致对象状态的丢失。