1. 程式人生 > >JAVA中的工廠模式和單例模式講解

JAVA中的工廠模式和單例模式講解

轉載:http://blog.csdn.net/fangleijiang/article/details/19912667

1.單例模式

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案

方法一:

  1. publicclass Singleton{  
  2.     publicstatic Singleton instance == null;  
  3.     private singleton() { }   
  4.     publicstatic Singleton getSingleton(){  
  5.         if(null == instance){  
  6.             instance = new Singleton();  
  7.         }   
  8.         return instance;  
  9.     }  
  10. }  
   方法二:
    1. publicclass Singleton2 {    
    2.     privatestatic Singleton2 instance2 = null;    
    3.     publicstaticsynchronized Singleton2 getInstance() {    
    4.     if (instance2 == null)    
    5.             instance2 = new Singleton2();    
    6.         return instance2;    
    7.     }    
    8. }   



    優點

    一、例項控制 單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。 二、靈活性 因為類控制了例項化過程,所以類可以靈活更改例項化過程。
  1. 2.工廠模式
  2. 工廠模式就是專門負責將大量有共同介面(或者共同抽象父類)的類例項化,而且不必事先知道每次是要例項化哪一個類的模式。它定義一個用於建立物件的介面,由子類決定例項化哪一個類。

  3. 優點

    根據外界給定的資訊,決定究竟應該建立哪個具體類的物件.外部程式僅僅需要負責“消費”物件就可以了。而不必管這些物件究竟如何建立及如何組織的。
    缺點
    由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了

  4. 使用場景
    工廠類負責建立的物件比較少;
    客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心;
    由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。
  5. (工廠模式中運用了多型)
具體例子: 一個Animal的抽象類
  1. package com.bean;  
  2. publicclass Cat extends Animal{  
  3. @Override
  4.     publicvoid eat() {  
  5.         System.out.println("I am a Cat,I like eat fish!!");  
  6.     }  
  7. }  

三個具體的動物類
  1. package com.bean;  
  2. publicclass Cat extends Animal{  
  3. @Override
  4.     publicvoid eat() {  
  5.         System.out.println("I am a Cat,I like eat fish!!");  
  6.     }  
  7. }  

  1. package com.bean;  
  2. publicclass Dog extends Animal{  
  3.     @Override
  4.     publicvoid eat() {  
  5.         System.out.println("I am a dog,I like eat feat!!!!!");  
  6.     }  
  7. }  

  1. package com.bean;  
  2. publicclass Sheep extends Animal{  
  3. private String name;  
  4. public String getName() {  
  5.     return name;  
  6. }  
  7. publicvoid setName(String name) {  
  8.     this.name = name;  
  9. }  
  10. @Override
  11. publicvoid eat() {  
  12.     // TODO Auto-generated method stub
  13. }  
  14. }  

工廠類
  1. package com.factory;  
  2. import com.bean.Animal;  
  3. import com.bean.Cat;  
  4. import com.bean.Dog;  
  5. import com.bean.Sheep;  
  6. publicclass Animal_Factory {  
  7.     privatestatic Animal animal = null;  
  8.         publicstatic Animal getAnimal(String animal_name){  
  9.             if(animal_name.equals("Dog")){  
  10.                 animal = new Dog();  
  11.             }  
  12.             if(animal_name.equals("Cat")){  
  13.                 animal = new Cat();  
  14.             }  
  15.             if(animal_name.equals("Sheep")){  
  16.                 animal = new Sheep();  
  17.             }  
  18.             return animal;  
  19.         }  
  20. }  

測試類:
  1. package com.factory.test;  
  2. import com.bean.Animal;  
  3. import com.factory.Animal_Factory;  
  4. publicclass Factory_Test {  
  5.     /** 
  6.      * @param args 
  7.      */
  8.     publicstaticvoid main(String[] args) {  
  9.         Animal animal_a = Animal_Factory.getAnimal("Dog");  
  10.         animal_a.eat();  
  11.         Animal animal_b = Animal_Factory.getAnimal("Cat");  
  12.         animal_b.eat();  
  13.     }