Java——設計模式(簡單工廠模式)
阿新 • • 發佈:2019-01-01
* A:簡單工廠模式概述
* 簡單工廠模式又叫靜態工廠方法模式,它定義了一個具體的工廠類負責建立一些類的例項
* B:優點
* 客戶端不需要再負責物件的建立,從而明確了各個類的職責
* 簡單來說,客戶端你只需要用就可以了,就不用建立了,工廠來建立就可以了
* C:缺點
* 這個靜態工廠類負責所有物件的建立,如果有新的物件增加,或者某些物件的建立方式不同,就需要不斷地修改工廠類,不利於後期的維護
* 也就是說:你得需要不斷地去修改你的原始碼,是不利於後期的維護的
* D:案例演示
* 動物抽象類:public abstract Animal(public abstract void eat();)
* 具體狗類:public class Dog extends Animal{}
* 具體貓類:public class Cat extends Animal{}
* 開始:在測試類中每個具體的內容自己建立物件,但是,建立物件的工作如果比較麻煩,就需要有人專門做這個事情,所以就製造了一個專門的類來建立物件
*
* 例如:本來我們建立物件需要自己去建立,比如說,你需要一隻狗,自己就建立一個,而簡單工廠認為,對於這件事就不勞費客戶了,建立狗物件或者是貓物件,交個簡單工廠去建立就可以了
* 要狗,簡單工廠就會給客戶提供狗,要貓,簡單工廠就會給顧客提供貓;所以,現在我們就要做一個工廠,這個工廠就是用來生產狗,或者貓的;
* 首先,要建立工廠得有Animal、Dog、Cat這些類
package com.yy.簡單工廠;
public abstract class Animal { //建立一個動物抽象類,在這個Animal抽象類裡面有個 吃 的方法
public abstract void eat();
}
package com.yy.簡單工廠;
public class Dog extends Animal { //建立一個狗類,讓Dog類去繼承Animal這個抽象類
public void eat(){ //並且去重寫Animal裡面的的eat這個抽象方法
System.out.println("狗吃肉" ); //然後輸出一句話:狗吃肉
}
}
package com.yy.簡單工廠;
public class Cat extends Animal { //建立一個貓類,讓Cat類去繼承Animal這個抽象類
public void eat() { //並且去重寫Animal裡面的的eat這個抽象方法
System.out.println("貓吃魚"); //然後輸出一句話:狗吃肉
}
}
package com.yy.簡單工廠;
public class AnimalFactory { //建立一個動物工廠,目的是為了生產動物,可以生產狗,也可以生產貓,需要啥就建立啥物件即可
/*
public static Dog createDog(){ //該方法用來建立狗
return new Dog(); //返回一個狗
}
public static Cat createCat(){ //該方法用來建立貓
return new Cat(); //返回一個貓
}
*/
//我們發現,如果動物太多的話,必須得定義很多個方法,複用性太差
//改進
public static Animal createAnimal(String name){ //返回型別為Animal,引數為一個 名字
if("dog".equals(name)){ //如果傳入的是一隻狗的話,就對引數進行判斷
return new Dog(); //引數是狗,就返回一個狗
}else if("cat".equals(name)){ //如果傳入的是一隻貓的話,就對引數進行判斷
return new Cat(); //引數是貓,就返回一個狗
}else { //如果傳入的是既不是狗又不是貓的話
return null; //就返回一個null
}
//如果在有一個其他的類,就會返回null,一返回null,Test這個類就會進行,null就開始呼叫eat這個方法,然後就會出現空指標異常,這個就是簡單工廠模式的弊端所在
}
}
package com.yy.簡單工廠;
public class Test { //做一個測試類
public static void main(String[] args) {
/*Dog yy = AnimalFactory.createDog(); //想要一隻狗,運用 類名. 來呼叫
System.out.println(yy);*/ //列印 狗 ,這裡沒有重寫toString方法,所以返回為類名[email protected]+HashCode16進位制
Dog d = (Dog) AnimalFactory.createAnimal("dog"); //通過 類名. 來呼叫,由於 AnimalFactory.createAnimal該方法返回的是Animal,而我們通過Dog接收,所以這時要進行強轉,由Animal型別強制轉換為Dog型別
d.eat(); //類名.方法 呼叫Dog類裡面的eat方法
//輸出結果:狗吃肉
Cat c = (Cat) AnimalFactory.createAnimal("cat");
c.eat();
//輸出結果:貓吃魚
}
}