1. 程式人生 > >Java——設計模式(簡單工廠模式)

Java——設計模式(簡單工廠模式)

 * 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();
        //輸出結果:貓吃魚
    }

}