* 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方法,所以返回為類名+@+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();//輸出結果:貓吃魚}}