工廠模式的定義
工廠模式叫虛擬構造,多態工廠,工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用於創建對象的接口,由子類決定實例化哪一個類
用UML的類圖如下;看附件
工廠方法創建對象的接口,工廠方法把實例推遲到子類
爲了更好的理解工廠模式,我舉一個例子,在一個在一個醫院裏有不同的科室,創建一個醫院接口,實現兩個不同的科室實現醫院的接口,方法是創建新的對象,就是創建不同的醫生對象,然後再創建一個醫生接口,實現不一樣的醫生,在工廠中創建,然後就可以降低對象和對象之間的耦合度,提高了系統的靈活性。可以通過工廠方法調用不同醫生的調度。
工廠模式的優勢
應用程序的實例對象都放在一個地方來進行創建,利於對對象的管理和規劃,對傳值的操作有統一的規劃
在不修改應用程序其他類和參數的情況下類和對象,並對應用程序的持久性有更好的維護和升級
工廠模式的使用場景
1.一個系統應當不依賴於產品類實例被創立,就是實例的改變並不影響其他實例的使用。
2.這個系統的產品很多的時候,不知道該調用哪一個實例。應該考慮使用工廠模式
3.同屬於一個實例,應該考慮不同的影響,從而減少依賴
4.不同的產品以一系列的接口的面貌出現,從而使系統不依賴於接口實現,從而很好地去恪守接口隔離的原則。
例子:
把三好學生的描述作爲例子
首先創建班級接口
public interface IClassFactory {
IStudent CreateStudent();
}
然後創建實現班級接口類
/**
*
* @author lxh
*
*/
1.public class IClassOneFactory implements IClassFactory {
@Override
public IStudent CreateStudent() {
// TODO Auto-generated method stub
return new Student1();
}
}
2.
public class IClassTwoFactory implements IClassFactory {
@Override
public IStudent CreateStudent() {
// TODO Auto-generated method stub
return new Student2();
}
}
創建接口ISudent
public interface IStudent {
public int SkillOne();
public void SkillTwo();
public void Industry();
}
創建實現類
public class Student1 implements IStudent {
@Override
public int SkillOne() {
// TODO Auto-generated method stub
int ss=11;
System.out.println("刻苦勤奮,勇於創新");
return ss;
}
@Override
public void SkillTwo() {
// TODO Auto-generated method stub
System.out.println("學習努力,有上進心");
}
@Override
public void Industry() {
// TODO Auto-generated method stub
System.out.println("吃苦,勤勞勇敢");
}
public String toString(Object String){
String s="優點1:"+this.SkillOne();
return s;
}
}
學生2:。。。
創建測試類
/**
* <h1>工廠模式</h1>
*
* @author lxh
*
*/
public class ClientTest {
/**
* <br>工廠方法模式實現時,客戶端需要決定實例化那個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端代碼來進行。
* 你想要加的功能,本來是改工廠類的,而現在是修改客戶端。
*
*/
public static void main(String[] args) {
System.out.println("學生1:");
IClassFactory factory=new IClassOneFactory();
IStudent becility=factory.CreateStudent();
becility.SkillOne();
becility.SkillTwo();
//becility.Industry();
System.out.println("學生2:");
IClassFactory factory2=new IClassTwoFactory();
IStudent industry=factory2.CreateStudent();
// industry.SkillOne();
// industry.SkillTwo();
industry.Industry();
}
}
結果:
學生1:
刻苦勤奮,勇於創新
學習努力,有上進心
學生2:
任勞任怨,是個好學生
通過這個學習,對工廠模式的創建和實現有進一步的實現,對設計模式的簡潔與應用的場景有更好的瞭解,在實踐中應用生活的例子,讓學習更有感覺。發現生活中的美才是學習的最好的詮釋。
應用:
javaweb設計模式之道