天天看點

設計模式-三種工廠模式

一、工廠模式的定義與特點

       工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。

工廠模式分為三類:

  1. 簡單工廠模式
  2. 工廠方法模式
  3. 抽象工廠模式

二、三種工廠模式的說明與實作

1.簡單工廠模式

簡單工廠的定義:提供一個建立對象執行個體的功能,而無須關心其具體實作。被建立執行個體的類型可以是接口、抽象類,也可以是具體的類。

假定我們是一家汽車公司,主打高端市場,(創業公司為啥不先從低端市場幹起呢?因為寫部落格不容易啊,代碼都敲出來了)創業艱辛,隻在市中心租了一間門面,但是汽車工廠在郊區。4s店裡隻擺放了幾個樣品車,提車需要去郊外。現業務流程如下。

/**
 * 假定我們是汽車4S店,當顧客需要一輛車時,我們就讓工廠提供使用者指定的車
 */
public class Test {


    public static void main(String[] args) {
        //有一個顧客想要寶馬
        CarFactory carFactory =new CarFactory();
        Car car = carFactory.getCar("bmW");
        System.out.println(car.getName()); //輸出寶馬,正确
    }
}

//定義汽車标準
interface Car{
    String getName();
}
//寶馬的具體實作
class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

//奔馳的具體實作
class Benz implements Car {

    @Override
    public String getName() {
        return "Benz";
    }
}

//汽車工廠
class CarFactory {
    public Car getCar(String name) {
        if (name.equalsIgnoreCase("Bmw")) {
            return new BMW();
        } else if (name.equalsIgnoreCase("Benz")) {
            return new Benz();
        } else {
            System.out.println("我們沒有這個型号");
            return null;
        }
    }
}
           

2.工廠方法模式

之前我們的汽車工廠面向的高端市場,産品大賣,現在為了搶占低端市場,推出了一系列的車型:五菱宏光、奧拓等等。再把這些車型和我們現車型一同管理,使我們的管理變得複雜層次不清。(還有就是要寫很多else  if)。于是乎我們将五菱宏光、奧拓另開一個工廠生産,成為子産品銷售,例如:小米與紅米。當你需要寶馬時,去找寶馬廠家,當你需要五菱宏光時,去找五菱宏光廠家提車。

/**
 * 為了搶占低端市場,公司推出五菱宏光與奧拓,但是将生産這兩個車型的任務交給原廠,會使得拓展業務較難,
 * 是以公司開設兩個廠子,一個廠生産寶馬等高端車,另一個廠生産五菱等低端車。
 * 代碼僅僅以寶馬,五菱為例
 */
public class Test {


    public static void main(String[] args) {
        //有一個顧客想要寶馬  就得跑到寶馬工廠提車
        CarFactory a = new BMWFactory();  //輸出 BMW
        System.out.println(a.getCar().getName());
        //另外一個顧客想要五菱  就跑到五菱工廠提車
        CarFactory b = new WuLingFactory();
        System.out.println(b.getCar().getName());//輸出 五菱宏光
    }
}

/**
 * 老總說了,所有廠子都得生産車,車的标準是。。。。。。
 */
interface CarFactory {
    Car getCar();
}

/**
 * 寶馬工廠==高端車工廠
 */
class BMWFactory implements CarFactory{

    @Override
    public Car getCar() {
        return new BMW();
    }
}

/**
 * 五菱工廠    等價于我們說的低端工廠
 */
class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

//定義汽車标準
interface Car{
    String getName();
}
//寶馬的具體實作
class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

//五菱宏光的具體實作
class WuLing implements Car {

    @Override
    public String getName() {
        return "五菱宏光";
    }
}

           

當使用者需要寶馬時,就得去寶馬工廠提車,當使用者需要五菱時,就得去五菱工廠提車。對使用者體驗是非常不好的。

3.抽象工廠模式

最近顧客老是投訴,嫌棄咱們的工廠太遠了,提車不友善,現在呢,公司有錢了,經過高層商量,就在咱們4S店周圍建立一個廠子,用于庫存。

/**
 * 經過了這麼多年的打拼,公司終于能在市裡建設一間工廠,充當庫存用了。
 */
public class Test {


    public static void main(String[] args) {
        //有一個顧客想要寶馬  我直接去4s店後面的倉庫取就行
        DefaultFactory a = new DefaultFactory();
        System.out.println(a.getCar("bmw").getName());//輸出bmw
    }
}

/**
 * 公司規定:
 * 老闆說,第三工廠,你是一個倉庫,我要啥車你就得給我啥車,寶馬廠子,五菱廠子都得協調你。
 * 比如:第三個工廠用于倉庫,既有奔馳,也有寶馬。其車輛來源就是寶馬,五菱工廠
 * 這個抽象類看做公司規定
 */
abstract class AbstractFactory {
    protected abstract Car getCar();

    public Car getCar(String name) {
        if ("BMW".equalsIgnoreCase(name)) {
            return new BMWFactory().getCar();
        } else if ("wuling".equalsIgnoreCase(name)) {
            return new WuLingFactory().getCar();
        } else {
            System.out.println("這個産品造不出來");
            return null;
        }
    }
}

/**
 * 在老闆這個規定下,第三廠-倉庫 蓋好了
 */
class DefaultFactory extends AbstractFactory {
    @Override
    protected Car getCar() {
        System.out.println("我不造車,但是我可以提供車");
        return null;
    }

    public Car getCar(String name) {
        return super.getCar(name);
    }


}

/**
 * 寶馬工廠==高端車工廠
 */
class BMWFactory extends AbstractFactory{

    @Override
    public Car getCar() {
        return new BMW();
    }
}

/**
 * 五菱工廠    等價于我們說的低端工廠
 */
class WuLingFactory extends AbstractFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}





//定義汽車标準
interface Car{
    String getName();
}
//寶馬的具體實作
class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

//五菱宏光的具體實作
class WuLing implements Car {

    @Override
    public String getName() {
        return "五菱宏光";
    }
}

           

公司步入正軌,我們也該回到現實。

這節課結束了,如果有不正确的地方,或者需要修改的地方,請大家多多指教。