1. 程式人生 > >設計模式_工廠模式

設計模式_工廠模式

就會 factory 抽象工廠模式 只需要 strong tor sys 破壞 oid

模式:創建型模式

? 普通的工廠模式
優點:編寫簡單,清晰
缺點:當工廠需要生產多一個車型,那就需要更改“工廠類”的代碼,這樣對開閉原則不好。

/**
 * 車的接口
 * */
public interface Car {
    public void drive();
}
/**
 * 奔馳
 * */
class Benz implements Car{

    @Override
    public void drive() {
        System.out.println("Benz");
    }
}
/**
 * 寶馬
 * */
class BMW implements Car{

    @Override
    public void drive() {
        System.out.println("BMW");
    }
}
class CarFactory { 
    public Car productCar(String car) {
        if ("Benz".equals(car)) {
            return new Benz();
        } else if("BMW".equals(car)) {
            return new BMW();
        } 
        
        return null;
    }
}

? 工廠方法模式
優點:解決了“普通工廠方法”中破壞的開閉原則。為了阻止“增加一個牌子就需要改一下工廠源碼”,我們決定換個思路來解決這個問題-“增加類”。當需要增加一個牌子的時候,我們就相應增加一個工廠類。利用 Java 多態

特性來解決這個問題。

我們繼續使用上面的代碼作為這個欄目的示例。

/**
 * 比亞迪
 * */
class BYD implements Car{

    @Override
    public void drive() {
        System.out.println("BYD");
    }
}

我們將相關的車輛抽象成一個工廠

/**
 * 工廠接口
 * */
interface Factory {
    void product() ;
}

然後生成一個"比亞迪"的工廠

/**
 * 比亞迪 - 工廠
 * */
class BYDFactory implements Factory {
    @Override
    public BYD product() {
        return new BYD();
    }
}

然後當我們想生產一個比亞迪的車輛,我們只需要這麽寫

class Test {
    public static void main(String[] args) {
        Factory factory = new BYDFactory();
        factory.product();
    }
}

同理,若我們再向增加多一個車輛的牌子生產,我們只需要遵循以下步驟

  1. 增加相關的汽車類,實現 C調用其product方法即可。
    ar 接口
  2. 增加相關汽車類的工廠,實現 Factory
  3. 通過實例化新增的汽車類的工廠類
    這樣做的好處是,當我們新增的類的時候,不需要更改源碼,只需要增加相關的類。

但是這個模式還是不夠完美。比如說,我想要一個 beaz 牌子的輪胎,我就加一個 beaz 的相關類及工廠類;我想要一個 beaz 牌子的輪胎,我就加一個 BYD 的相關類及工廠類...
太可怕了。這樣子加的類只會越來越多。
那該怎麽辦?
或許有人已經註意到了,其實無論是輪胎還是後視鏡,只要你想要的是 beaz 這個牌子的產品,那麽我們可以以牌子為維度來抽象。所以不僅僅是產品(如 beaz 輪胎)可以抽象,其實工廠也可以抽象!下面將講解對工廠的抽象。

? 抽象工廠模式
既然 beaz 不僅僅生產汽車,它還生產方向盤,雨刷,輪胎等等。所以我們可以認為抽象出一個工廠接口,定義好這個
這類抽象的方法。

public interface CarFactory {
    void createCar();
    Screen createScreen();
    AimingCircle createAimingCircle();
}

/**
 * 屏幕抽象
 * */
interface Screen {
}

/** 方向盤接口 */
interface AimingCircle {

}
/** 奔馳屏幕實現 */
class BenzScreen implements Screen {

}
/** 奔馳方向盤實現 */
class BenzAimingCircle implements AimingCircle {

}
/** 比亞迪屏幕實現 */
class BYDScreen implements Screen {

}
/** 比亞迪方向盤實現 */
class BYDAimingCircle implements AimingCircle {

}

/** 奔馳 一系列工廠 */
class BenzFactory implements CarFactory {

    @Override
    public void createCar() {
        System.out.println("創建一輛奔馳車");
    }

    @Override
    public Screen createScreen() {
        return new BenzScreen();
    }

    @Override
    public AimingCircle createAimingCircle() {
        return new BenzAimingCircle();
    }
}

/** BYD 一系列工廠 */
class BYDFactory implements CarFactory {

    @Override
    public void createCar() {
        System.out.println("創建一輛奔馳車");
    }

    @Override
    public Screen createScreen() {
        return new BYDScreen();
    }

    @Override
    public AimingCircle createAimingCircle() {
        return new BYDAimingCircle();
    }
}

其實細心一點的同學就會發現,其實工廠抽象工廠之間的不同之處在於,工廠的抽象維度在於產品,一個工廠只能生產一個產品;而抽象工廠的抽象維度在於工廠,這個工廠是可以生產多系列的產品。

設計模式_工廠模式