工廠設(shè)計(jì)模式


工廠:故名思議,就是用來制造各種產(chǎn)品的,在程序中主要是用來創(chuàng)建對象。

  • 首先介紹下簡單工廠(也稱靜態(tài)工廠)
class Car{
    
    public void run(){
        System.out.println("小車正在跑。。");
    }
}

public class SampleFactoryTest {

    public static void main(String[] args) {
        //調(diào)用者創(chuàng)建一個(gè)Car
        Car car = new Car();
        //調(diào)用者調(diào)用run方法
        car.run();
    }
}

通過以上代碼,你有沒有發(fā)現(xiàn)一個(gè)問題。就是調(diào)用者(main方法)在調(diào)用小車的run()之前還需要?jiǎng)?chuàng)建一個(gè)Car對象,就好比你想要開車,你會(huì)不會(huì)自己先做一輛車然后再去開?我想你不會(huì)的。所以為了讓調(diào)用者和創(chuàng)建者分離,工廠設(shè)計(jì)模式應(yīng)允而生。

class Car{
    
    public void run(){
        System.out.println("小車正在跑。。");
    }
}
/**
 * 汽車工廠
 *
 */
class CarFactory{
    //加上static方便調(diào)用,也稱靜態(tài)工廠
    public static Car createCar(){
        return new Car();
    }
    
}

public class SampleFactoryTest {

    public static void main(String[] args) {
        //通過工廠創(chuàng)建一個(gè)Car
        Car car = CarFactory.createCar();
        //調(diào)用者調(diào)用run方法
        car.run();
    }
}

實(shí)際應(yīng)用當(dāng)然不止才一個(gè)類型的車,下面是一個(gè)詳細(xì)的例子:


interface Car{
    
    public void run();
}

class Benz implements Car{

    @Override
    public void run() {
        System.out.println("奔馳在跑...");
    }
    
}

class Bmw implements Car{

    @Override
    public void run() {
        System.out.println("寶馬在跑...");
    }
    
}
/**
 * 汽車工廠
 *
 */
class CarFactory{
    /**
     * 簡單工廠一般加上static方便訪問
     * 通過不同類型獲得不同的車
     * @param type 類型
     * @return 車
     */
    public static Car createCar(String type){
        Car car = null;
        if(type.equals("benz")){
            car = new Benz();
        } else if(type.equals("bmw")){
            car = new Bmw();
        }
        return car;
    }
    
}
/**
 * 也可以為每一種汽車寫一個(gè)單獨(dú)的方法
 */
class CarFactory2{
    /**
     * 簡單工廠一般加上static方便訪問
     * 通過不同類型獲得不同的車
     * @param type 類型
     * @return 車
     */
    public static Car createBenz(){
        return new Benz();
    }
    
    public static Car createBmw(){
        return new Bmw();
    }
    
}

public class SampleFactoryTest {

    public static void main(String[] args) {
        //通過工廠創(chuàng)建一個(gè)Benz
        //Car benz = CarFactory.createCar("benz");
        //Car bmw = CarFactory.createCar("bmw");
        Car benz = CarFactory2.createBenz();
        Car bmw = CarFactory2.createBmw();
        //調(diào)用者調(diào)用run方法
        benz.run();
        bmw.run();
    }
}

到這里一個(gè)簡單工廠的實(shí)現(xiàn)已經(jīng)完成,但是現(xiàn)在會(huì)有一個(gè)新的問題,當(dāng)你要新增Car的時(shí)候,勢必要去修改工廠方法來適應(yīng)新的需求,這樣便破壞了Open-closed Principle,下面是修改后的:

interface Car{
    
    public void run();
}

class Benz implements Car{

    @Override
    public void run() {
        System.out.println("奔馳在跑...");
    }
    
}

class Bmw implements Car{

    @Override
    public void run() {
        System.out.println("寶馬在跑...");
    }
    
}
/**
 * 將工廠抽象為接口
 *
 */
interface CarFactory{
    Car createCar();
}
/**
 * 奔馳工廠
 *
 */
class BenzFactory implements CarFactory{

    @Override
    public Car createCar() {
        return new Benz();
    }
    
}

/**
 * 寶馬工廠
 *
 */
class BmwFactory implements CarFactory{

    @Override
    public Car createCar() {
        return new Bmw();
    }
    
}


public class SampleFactoryTest {

    public static void main(String[] args) {
        
        //通過工廠創(chuàng)建對象
        Car benz = new BenzFactory().createCar();
        Car bmw = new BmwFactory().createCar();
        //調(diào)用者調(diào)用run方法
        benz.run();
        bmw.run();
    }
}

以上就是工廠方法模式,和簡單工廠略有不同,通過抽象工廠為接口解決了OCP,現(xiàn)在的這個(gè)工廠變得更好擴(kuò)展了,但其實(shí)這種寫法復(fù)雜了很多,還是看你怎么取舍了吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容