JavaEE進(jìn)階知識學(xué)習(xí)-----設(shè)計(jì)模式---普通工廠模式

概述

在設(shè)計(jì)原則中有這樣的一句話“我們應(yīng)該針對接口編程,而不是針對實(shí)現(xiàn)編程”,但是,在大部分的情況下,我們都是以new關(guān)鍵字來創(chuàng)建對象的,針對接口編程的原因在于多態(tài)的使用,我們希望能夠調(diào)用一個(gè)簡單的方法,傳遞一個(gè)參數(shù)就可以返回一個(gè)相應(yīng)的對象,這個(gè)時(shí)候我們不在是采用new來創(chuàng)建對象,這個(gè)就是普通工廠模式,也叫簡單工廠模式。
舉個(gè)例子說吧,現(xiàn)實(shí)中車子的種類很多,大巴車,轎車,救護(hù)車,越野車等等,每一個(gè)種類下面還有很多的型號,一個(gè)工廠生產(chǎn)這么多的車很難管理,就會有很多分廠,例如生產(chǎn)轎車的分廠,生產(chǎn)貨車的分廠,但是,客戶不需要知道工廠是怎么區(qū)分的,客戶只會告訴客服,他需要什么車,客服會根據(jù)客戶的需求去找到對應(yīng)的車長去生產(chǎn)車,對客戶來說,工廠只是一個(gè)抽象的概念,他只知道有這么一個(gè)工廠能滿足他的需要。

上述例子的類圖

image

偽代碼

public class ProductFactory{
    public static IProduct createProduct(String productNo){
        switch (productNo) {
        case "1":
            return new Product1(XXXX);
        case "2":
            return new Product2(XXXX);
        case "3":
            return new Product3(XXXX);
        case "4":
            return new Product4(XXXX);
        case "5":
            return new Product5(XXXX);

        default: throw new
            NotSupportedException("不支持此編號的車");
            break;
        }
    }
}

定義

普通工廠模式又稱為靜態(tài)工廠方法,屬于創(chuàng)建型模式,在普通工廠模式中,可以根據(jù)傳遞的參數(shù)不同,返回不同類的實(shí)例,普通工廠模式定義了一個(gè)類,這個(gè)類專門用于創(chuàng)建其他類的實(shí)例,這些被創(chuàng)建的類都有一個(gè)共同的父類。

普通工廠模式的實(shí)現(xiàn)

情景:在一個(gè)披薩店中,要根據(jù)不同客戶的口味,生產(chǎn)不同的披薩,類圖如下:


image

代碼實(shí)現(xiàn)

SimplyPizzaFactory工廠類

/**
 *生產(chǎn)披薩的工廠類
 * @author lky
 */
public class SimplyPizzaFactory {
    public Pizza createPizza(String type){
        Pizza pizza = null;
        if(type.equals("cheese")){
            pizza = new CheesePizza();
        }
        else if(type.equals("clam")){
            pizza = new ClamPizza();
        }
        else if(type.equals("pepperoni")){
            pizza = new PepperoniPizza();
        }
        else if(type.equals("veggie")){
            pizza = new VeggiePizze();
        }
        return pizza;
        
    }

}

抽象披薩類

public abstract class  Pizza {
    public abstract void prepare();
    
    public abstract void bak();
    
    public abstract void cut();
    
    public abstract void box();

}

具體披薩CheesePizza

public class CheesePizza extends Pizza{

    @Override
    public void prepare() {
        System.out.println("CheesePizza披薩正在準(zhǔn)備");
    }

    @Override
    public void bak() {
        System.out.println("CheesePizza披薩正在烘烤");
    }

    @Override
    public void cut() {
        System.out.println("CheesePizza披薩正在切片");
    }

    @Override
    public void box() {
        System.out.println("CheesePizza披薩正在裝盒");
    }

}

具體披薩ClamPizza

public class ClamPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("ClamPizza披薩正在準(zhǔn)備");
    }

    @Override
    public void bak() {
        System.out.println("ClamPizza披薩正在烘烤");
    }

    @Override
    public void cut() {
        System.out.println("ClamPizza披薩正在切片");
    }

    @Override
    public void box() {
        System.out.println("ClamPizza披薩正在裝盒");
    }
}

具體披薩PepperoniPizza

public class PepperoniPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("PepperoniPizza披薩正在準(zhǔn)備");
    }

    @Override
    public void bak() {
        System.out.println("PepperoniPizza披薩正在烘烤");
    }

    @Override
    public void cut() {
        System.out.println("PepperoniPizza披薩正在切片");
    }

    @Override
    public void box() {
        System.out.println("PepperoniPizza披薩正在裝盒");
    }
}

具體披薩VeggiePizze

public class VeggiePizze extends Pizza{
    @Override
    public void prepare() {
        System.out.println("VeggiePizze披薩正在準(zhǔn)備");
    }

    @Override
    public void bak() {
        System.out.println("VeggiePizze披薩正在烘烤");
    }

    @Override
    public void cut() {
        System.out.println("VeggiePizze披薩正在切片");
    }

    @Override
    public void box() {
        System.out.println("VeggiePizze披薩正在裝盒");
    }
}

披薩商店類

public class PizzaStore {
    SimplyPizzaFactory factory;
    
    public PizzaStore(SimplyPizzaFactory factory) {
        this.factory = factory;
    }
    
    public Pizza orderPizza(String type){
        Pizza pizza;
        pizza = factory.createPizza(type);//采用工廠對象的創(chuàng)建方法實(shí)例化
        pizza.prepare();
        pizza.bak();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

總結(jié)

  • 普通工廠模式實(shí)現(xiàn)了對責(zé)任的分割,提供了專門的工廠用于創(chuàng)建對象。
  • 客戶端不需要知道所創(chuàng)建的具體產(chǎn)品的類名,只要知道產(chǎn)品類對應(yīng)的編號即可。
  • 要點(diǎn)就是當(dāng)你需要什么,只需要傳入一個(gè)正確的參數(shù)就可以,不需要關(guān)心它具體的實(shí)現(xiàn)細(xì)節(jié)。
  • 如果產(chǎn)品過多就會導(dǎo)致工廠類的代碼十分的復(fù)雜。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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