北風設計模式課程---享元模式與單例模式區別


北風設計模式課程---享元模式與單例模式區別

一、總結

一句話總結:

不僅要通過視頻學,還要看別的博客里面的介紹,搜講解,搜作用,搜實例

 

1、享元模式與單例模式區別?

級別:單例模式是類級別的,一個類只能有一個對象實例;享元模式是對象級別的,可以有多個對象實例,多個變量引用同一個對象實例;
對象個數:享元模式可以再次創建對象 也可以取緩存對象,單例模式則是嚴格控制單個進程中只有一個實例對象

 

2、享元模式與單例模式的共同點?

實現節省對象創建的時間
節約內存資源

 

 

 

二、享元模式與單例模式區別

轉自或參考:享元模式與單例模式區別
https://blog.csdn.net/fanchengkai1218/article/details/51840612

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/fanchengkai1218/article/details/51840612

單例模式是類級別的,一個類只能有一個對象實例;

享元模式是對象級別的,可以有多個對象實例,多個變量引用同一個對象實例;

享元模式主要是為了節約內存空間,提高系統性能,而單例模式主要為了可以共享數據;

1:單例模式

public class Singleton {
// 我來寫一個單例模式 懶漢式
private static Singleton singleton;
private Singleton(){}

public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
public static void main(String[] args) {
Singleton instance1 = Singleton.getSingleton();
Singleton instance2 = Singleton.getSingleton();
System.out.println(instance1==instance2);
}
}

 

2:享元模式

//享元模式是多個變量公用一個對象實例 大大節約了內存空間 提高了系統性能 String類是final類型 就是使用了享元模式
//數據庫連接池 線程池也是享元模式的應用
public abstract class Flyweight {
// 享元模式 享元抽象類
public abstract void operation();
}

 

//具體類 享元實現類
public class CreateFlyweight extends Flyweight {

private String str;

public CreateFlyweight(String str) {
this.str = str;
}

@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("Create---Flyweight:" + str);
}

public static void main(String[] args) {
Flyweight flyweight = new CreateFlyweight("fanck");
flyweight.operation();
}

}

//工廠方法類 維護一個對象存儲池 享元工廠類
public class FlyweightFactory {
private Hashtable flyweights = new Hashtable();

public FlyweightFactory() {
};

public Flyweight getFlyweight(Object obj) {
Flyweight flyweight = (Flyweight) flyweights.get(obj);
if (flyweight == null) {
flyweight = new CreateFlyweight((String) obj);
flyweights.put(obj, flyweight);
}
return flyweight;
}

public int getFlyweightSize() {
System.out.println("flyweights:"+flyweights);
return flyweights.size();
}

public static void main(String[] args) {
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fly1 = flyweightFactory.getFlyweight("abc");
Flyweight fly2 = flyweightFactory.getFlyweight("b");
Flyweight fly3 = flyweightFactory.getFlyweight("abc");
Flyweight fly4 = flyweightFactory.getFlyweight("ef");
Flyweight fly5 = flyweightFactory.getFlyweight("ef");
Flyweight fly6 = flyweightFactory.getFlyweight("ef");
fly1.operation();
fly2.operation();
fly3.operation();
fly4.operation();
fly5.operation();
fly6.operation();
System.out.println(flyweightFactory.getFlyweightSize());
}
}


 

享元模式可以再次創建對象 也可以取緩存對象

 

單例模式則是嚴格控制單個進程中只有一個實例對象

 

享元模式可以通過自己實現對外部的單例 也可以在需要的使用創建更多的對象

 

單例模式是自身控制 需要增加不屬於該對象本身的邏輯

 

 

 

兩者都可以實現節省對象創建的時間 ThreadPool 線程池 與數據庫連接池 都有使用享元模式

 

 

 

 

 

 


免責聲明!

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



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