北風設計模式課程---享元模式與單例模式區別
一、總結
一句話總結:
不僅要通過視頻學,還要看別的博客里面的介紹,搜講解,搜作用,搜實例
1、享元模式與單例模式區別?
級別:單例模式是類級別的,一個類只能有一個對象實例;享元模式是對象級別的,可以有多個對象實例,多個變量引用同一個對象實例;
對象個數:享元模式可以再次創建對象 也可以取緩存對象,單例模式則是嚴格控制單個進程中只有一個實例對象
2、享元模式與單例模式的共同點?
實現節省對象創建的時間
節約內存資源
二、享元模式與單例模式區別
轉自或參考:享元模式與單例模式區別
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 線程池 與數據庫連接池 都有使用享元模式
