工廠模式

本章內(nèi)容 1. 簡(jiǎn)單工廠模式(也叫靜態(tài)工廠模式),2.工廠方法模式,3.抽象工廠模式

  • 特別建議大家可以敲下設(shè)計(jì)模式的代碼,看上去簡(jiǎn)單,但是敲出來(lái)心里會(huì)很踏實(shí)。

靠靠靠,覺(jué)得真無(wú)聊?請(qǐng)直接往下翻到代碼和代碼中的注釋,看完后在來(lái)看學(xué)術(shù)性的東西吧....

  • 什么是工廠模式?
    工廠,大家都知道富士康連跳,啊呸!內(nèi)個(gè)...富士康就是生產(chǎn)的根據(jù)別人的訂單,用模具來(lái)生產(chǎn)別人需要的的嘛!那其中“模具”就相當(dāng)面向?qū)ο笳Z(yǔ)言JAVA中具體的類【如果知道面向?qū)ο螅敲搭惒痪褪蔷痛砹艘活悓?duì)象的模板,嗯?】
    對(duì)應(yīng)到下面代碼就是Audi.class【奧迪汽車生產(chǎn)模板】
    Benz.class【奔馳汽車生產(chǎn)模板】。那么問(wèn)題來(lái)了:“BMW的中文車名是?” 對(duì) “別摸我!”。我廢話真多 ;
    富士康的生產(chǎn)對(duì)應(yīng)的就是SimpleFactory.class。
    那用在設(shè)計(jì)模式中,那就是用來(lái)接收別人的委托,生產(chǎn)委托人類需要的對(duì)象。我猜你心里肯定在罵BB了半天,終于講到重點(diǎn)了!所以還不趕緊那個(gè)本子記下來(lái)

下面一大堆廢話可以看看,也可以看完代碼之后再看,會(huì)獲益匪淺:

  • 工廠方法模式(英語(yǔ):Factory method pattern)是一種實(shí)現(xiàn)了“工廠”概念的面向?qū)ο笤O(shè)計(jì)模式。就像其他創(chuàng)建型模式一樣,它也是處理在不指定對(duì)象具體類型 的情況下創(chuàng)建對(duì)象的問(wèn)題。工廠方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類來(lái)決定實(shí)例化哪個(gè)類。工廠方法讓類的實(shí)例化推遲到子類中進(jìn)行?!?/li>
  • 為什么用工廠模式

創(chuàng)建一個(gè)對(duì)象常常需要復(fù)雜的過(guò)程,所以不適合包含在一個(gè)復(fù)合對(duì)象中。創(chuàng)建對(duì)象可能會(huì)導(dǎo)致大量的重復(fù)代碼,可能會(huì)需要復(fù)合對(duì)象訪問(wèn)不到的信息,也可能提供不了足夠級(jí)別的抽象,還可能并不是復(fù)合對(duì)象概念的一部分。工廠方法模式通過(guò)定義一個(gè)單獨(dú)的創(chuàng)建對(duì)象的方法來(lái)解決這些問(wèn)題。由子類實(shí)現(xiàn)這個(gè)方法來(lái)創(chuàng)建具體類型的對(duì)象。實(shí)現(xiàn)了依賴的反轉(zhuǎn)。

1.簡(jiǎn)單工廠模式

重點(diǎn):沒(méi)有滿足傳說(shuō)中的開(kāi)閉原則(OCP),所以他擴(kuò)展需要修改代碼

  • 測(cè)試調(diào)用
public class Client{

    //調(diào)用工廠模式,只需要知道需要的創(chuàng)建的類型
    public static void main(String[] args) {
        
        Car car = SimpleFactory.getCar("audi");
        car.bebe();

    }

}
  • 簡(jiǎn)單工廠模式
/**
 * 簡(jiǎn)單工廠模式
 */
public class SimpleFactory{

    //用于生產(chǎn)的生產(chǎn)方法
    public static Car getCar(String type) {

        if("audi".equals(type)) {
            return new Audi();
        } else if("benz".equals(type)) {
            return new Benz();
        } else {
            return null;
        }

    }

}

//需要?jiǎng)?chuàng)建的對(duì)象
interface Car{
    void bebe();
}

class Audi implements Car{
    public void bebe(){
        System.out.println("audi bebe");
    }
}

class Benz implements Car{

    public void bebe(){
        System.out.println("benz bebe");
    }

}

2. 工廠方法模式

工廠方法模式滿足擁有了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),同時(shí)又滿足了開(kāi)閉原則,易擴(kuò)展;

UML圖
  • 沒(méi)有依賴關(guān)系的UML


    image.png
  • 加上依賴后的UML
    雜亂了許多,但這樣帶來(lái)的好處是容易擴(kuò)展;如需擴(kuò)展,不用修改代碼,增加Mylog接口的實(shí)現(xiàn)類,增加LogFactory接口的實(shí)現(xiàn)類,就可以實(shí)現(xiàn)擴(kuò)展!而這是簡(jiǎn)單工廠模式不能實(shí)現(xiàn)的
    image.png
具體代碼分析

需要生產(chǎn)的產(chǎn)品


interface Mylog{

    void print();

}

//具體的產(chǎn)品1
public class DatabaseLog implements Mylog{

    public void print(){
        System.out.println("database log ");
    }

}
//具體的產(chǎn)品2
public class FileEditLog implements Mylog{

    public void print(){
        System.out.println("file edited... ");
    }

}

工廠

//工廠接口
interface LogFactory{

    Mylog crateLog();

}

public class DatabaseLogFactory implements LogFactory{

    public Mylog crateLog(){
        return new DatabaseLog();
    }

}

public class FileEditLogFactory implements LogFactory{

    public Log crateLog(){
        return new FileEditLog();
    }

}

測(cè)試

public class Main{

    public static void main(String[] args) {
        
        Mylog log = new DatabaseLogFactory().crateLog();
        log.print();

    }

}

3.抽象工廠模式

抽象工廠模式有了產(chǎn)品族的概念,

  • 什么叫產(chǎn)品族呢?
    在抽象工廠模式中,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的海爾電視機(jī)、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級(jí)結(jié)構(gòu)中,海爾電冰箱位于電冰箱產(chǎn)品等級(jí)結(jié)構(gòu)中。
  • 當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時(shí)需要使用抽象工廠模式。
  • 抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。
  • 抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),一個(gè)工廠等級(jí)結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建 。當(dāng)一個(gè)工廠等級(jí)結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對(duì)象時(shí),抽象工廠模式比工廠方法模式更為簡(jiǎn)單、有效率。
UML圖
image.png
源碼
  • 工廠定義
public interface AbstractFactory {

    void createProductA();
    void crateProductB();

}

//ContreteFactory1 生產(chǎn)的就是1級(jí)的機(jī)器人,他fight和run都很厲害

public class ContreteFactory1 implements AbstractFactory {
    @Override
    public void createProductA() {
        new ProductA1().fight();
        System.out.println();
    }

    @Override
    public void crateProductB() {
        new ProductB1().run();
    }
}
  • ContreteFactory2 工廠生產(chǎn)的是2級(jí)的機(jī)器人,他fight和run稍差
public class ContreteFactory2 implements AbstractFactory {
    @Override
    public void createProductA() {
        new ProductA2().fight();
        System.out.println();
    }

    @Override
    public void crateProductB() {
        new ProductB2().run();
    }
}


  • 產(chǎn)品族定義
public interface AbstractPruductA {
    void fight();
}

public class ProductA1 implements AbstractPruductA {
    @Override
    public void fight() {
        System.out.println("productA1 fight");
    }
}


public class ProductA2 implements AbstractPruductA {
    @Override
    public void fight() {
        System.out.println("product A2 fight");
    }
}

public interface AbstractProductB {
    void run();
}

public class ProductB1 implements AbstractProductB {
    @Override
    public void run() {
        System.out.println("product B1 run");
    }
}

public class ProductB2 implements AbstractProductB {
    @Override
    public void run() {
        System.out.println("product B2 run");
    }
}

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

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

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