原型模式和單例模式的區別

原型模式和單例模式的區別 java

1.   定義上的區別

1.1.  原型模式

用原型模式是在已指定對象的基礎上,而後經過拷貝這些原型對象建立新的對象。 web

要實例化的類是在運行時刻指定或者爲了不建立一個與產品類層次平行的工廠類層次時或者當一個類的實例只能有幾個不一樣狀態組合中的一種時 —— 創建相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。  設計模式

1.2.  單例模式

單態設計模式的核心就是:將類的構造方法私有化,以後在類的內部產生實例化對象,並經過靜態方法返回實例化對象的應用。 安全

若是不但願一個類產生更多對象的狀況下,必須使用單態模式,所謂單態就是在對象的入口處(構造方法)限制了對象的實例化操做。 ide

2.   JAVA實現上的區別

2.1.  原型模式

  
  
  
  
  1. import java.util.ArrayList;  
  2.  
  3. class ConcretePrototype implements Cloneable {  

  
  
  
  
  1.  
  2.  
  3.     private String name;  
  4.     private ArrayList<String> nameList = new ArrayList<String>();  
  5.  
  6.     public ConcretePrototype(String name) {  
  7.         this.name = name;  
  8.         this.nameList.add(this.name);  
  9.     }  
  10.  
  11.     // 添加nameList中的對象  
  12.     public void setName(String name) {  
  13.         this.nameList.add(name);  
  14.     }  
  15.  
  16.     public ArrayList<String> getNameList() {  
  17.         return this.nameList;  
  18.     }  
  19.  
  20.     // 覆蓋Object基類中的clone()方法,並擴大該方法的訪問權限,具體化返回本類型  
  21.     public ConcretePrototype clone() {  
  22.         try {  
  23.             return (ConcretePrototype) super.clone();  
  24.         } catch (CloneNotSupportedException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.         return null;  
  28.     }  
  29. }  
  30.  
  31. public class TestConcretePrototype {  
  32.     public static void main(String args[]) {  
  33.         try {  
  34.             ConcretePrototype prototype = new ConcretePrototype("調用原型方法");  
  35.             // 經過clone獲取一個拷貝  
  36.             System.out.println(prototype.getNameList());  
  37.             ConcretePrototype fromClone = prototype.clone();  
  38.             fromClone.setName("調用克隆方法");  
  39.             System.out.println(fromClone.getNameList());  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44. }  

2.2.  單例模式

2.2.1. 單利模式的通用代碼

  
  
  
  
  1. class Singleton {  
  2.  
  3.     private Singleton() {  
  4.         // 將構造方法進行封裝,私有化  
  5.         // 定義爲private的,是爲了避免讓Singleton在外部生成對象,這才能體現單例模式  
  6.     }  
  7.       
  8.     // 在內部產生本類的實例化對象  
  9.     // 注意這是private只供內部調用  
  10.     private static Singleton instance = new Singleton();  
  11.  
  12.     public static Singleton getInstance() {  
  13.         // 經過靜態方法取得instance對象  
  14.         // 這裏提供了一個供外部訪問本class的靜態方法,能夠直接訪問  
  15.         return instance;  
  16.     }  
  17.  
  18.     public static void setInstance(Singleton instance) {  
  19.         Singleton.instance = instance;  
  20.     }  
  21. }  
  22.  
  23. public class TestSingleton {  
  24.     public static void main(String args[]) {  
  25.         // 初始化  
  26.         Singleton s1 = null;  
  27.         Singleton s2 = null;  
  28.         // 實例化對象  
  29.         s1 = Singleton.getInstance();  
  30.         s2 = Singleton.getInstance();  
  31.         // 若相等則表示生成的對象是惟一的  
  32.         System.out.println(s1 == s2);  
  33.     }  
  34. }  

2.2.2. 懶漢似的單例模式

  
  
  
  
  1. class SingletonLazy {
  2. // 在內部產生本類的實例化對象
  3. private static SingletonLazy instance = null;
  4. private SingletonLazy() {
  5. }
  6. // 線程安全,確保內存中只有一個實例
  7. public static synchronized SingletonLazy getInstance() {
  8. // 這個方法比上邊有所改進,不用每次都進行生成對象,只是第一次使用時生成實例
  9. if (instance == null) {
  10. instance = new SingletonLazy();
  11. }
  12. return instance;
  13. }
  14. }
  15. public class TestSingletonLazy {
  16. public static void main(String args[]) {
  17. // TODO Auto-generated method stub
  18. // 初始化
  19. SingletonLazy s1 = null;
  20. SingletonLazy s2 = null;
  21. // 實例化對象
  22. s1 = SingletonLazy.getInstance();
  23. s2 = SingletonLazy.getInstance();
  24. // 若相等則表示生成的對象是惟一的
  25. System.out.println(s1 == s2);
  26. }
  27. }

3.   Spring源碼學習

3.1.  Spring的原型模式

  
  
  
  
  1. abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
  2. implements BeanDefinition, Cloneable {
  3. private String scope = SCOPE_DEFAULT;
  4. private boolean singleton = true;
  5. private boolean prototype = false;
  6. public void setScope(String scope) {
  7. this.scope = scope;
  8. this.singleton = SCOPE_SINGLETON.equals(scope)
  9. || SCOPE_DEFAULT.equals(scope);
  10. this.prototype = SCOPE_PROTOTYPE.equals(scope);
  11. }
  12. public String getScope() {
  13. return this.scope;
  14. }
  15. @Override
  16. public Object clone() {
  17. return cloneBeanDefinition();
  18. }
  19. public abstract AbstractBeanDefinition cloneBeanDefinition();
  20. }
  21. public class SpringAbstractBeanDefinition {
  22. }

3.2.  Spring的單例模式

 

 

 

  
  
  
  
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. class SingletonBeanFactoryLocator implements BeanFactoryLocator {
  4. private static final Map<String, BeanFactoryLocator> instances = new HashMap<String, BeanFactoryLocator>();
  5. public SingletonBeanFactoryLocator(String resourceLocation) {
  6. }
  7. public static BeanFactoryLocator getInstance(String selector)
  8. throws BeansException {
  9. String resourceLocation = selector;
  10. // 線程安全,確保內存中只有一個實例
  11. synchronized (instances) {
  12. BeanFactoryLocator bfl = instances.get(resourceLocation);
  13. if (bfl == null) {
  14. bfl = new SingletonBeanFactoryLocator(resourceLocation);
  15. instances.put(resourceLocation, bfl);
  16. }
  17. }
  18. return getInstance(null);
  19. }
  20. }
  21. public class SpringSingletonBeanFactoryLocator {
  22. }
相關文章
相關標籤/搜索