單例模式--延時初始化


單例模式特點:構造函數聲明為private,對象獲取通過函數調用。

基本單例模式(餓漢模式):

final class Singleton{
private static Singleton s=new Singleton(47);
private int i;
private Singleton(int x){i=x;}

public static Singleton getReference(){
return s;
}
public int getValue(){return i;}
public void setValue(int x){i=x;}
}

靜態延時初始化(懶漢模式):
final class StaticSingleton{
private static StaticSingleton s;
private int i;
private StaticSingleton(int x){i=x;}

public static StaticSingleton getReference(){
if(s == null){
s=new StaticSingleton(47);
}
return s;
}

public int getValue(){return i;}
public void setValue(int x){i=x;}
}
類加載延時初始化:
final class InnerSingleton{
private static InnerSingleton s;
private int i;
private InnerSingleton(int x){i=x;}

private static class SingletonHolder{
static InnerSingleton instance =new InnerSingleton(47);
}
public static InnerSingleton getReference(){
return SingletonHolder.instance;
}

public int getValue(){return i;}
public void setValue(int x){i=x;}
}
查找注冊方式:
接口:
public interface EmployeeManagement {
static String name="";
public void setName(String name);
}
單例模式類:
final class Employee implements EmployeeManagement{
static String name;
private static Map<String,Employee> map = new HashMap<String,Employee>();
static{
Employee single = new Employee();
map.put(single.getClass().getName(), single);
}
public void setName(String name){
this.name=name;
}
protected Employee(){}
protected Employee(String name){this.setName(name);}
public static Employee getInstance(String name) {
if(name == null) {
name = Employee.class.getName();
System.out.println("name == null"+"--->name="+name);
}
if(map.get(name) == null) {
if(map.get(name) == null) {
try {
map.put(name, (Employee) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
return map.get(name);
}

public void getInfo(){
System.out.println(name+" is here .");
}
}
應用實例:
public class RegistryService {

public static void main(String[] args) {
Employee em=Employee.getInstance("singleton.Employee");
em.setName("SuYU");
em.getInfo();
}
}
資源:
https://share.weiyun.com/5kLvDQS
https://share.weiyun.com/5LRwSxS


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM