自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細(xì)解讀設(shè)計(jì)模式中的工廠(chǎng)模式

開(kāi)發(fā) 前端
Java中的工廠(chǎng)模式(Factory Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,而不需要在代碼中顯式指定所要?jiǎng)?chuàng)建的具體類(lèi)。

昨天我們說(shuō)了關(guān)于Java中的單例模式,以及Spring中單例模式的應(yīng)用,今天了不起就和大家來(lái)聊一下關(guān)于工廠(chǎng)模式的相關(guān)內(nèi)容。

工廠(chǎng)模式

Java中的工廠(chǎng)模式(Factory Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,而不需要在代碼中顯式指定所要?jiǎng)?chuàng)建的具體類(lèi)。工廠(chǎng)模式的主要目的是將對(duì)象的創(chuàng)建與使用分離,從而減少類(lèi)之間的耦合度,并使得軟件結(jié)構(gòu)更加靈活、可擴(kuò)展。

工廠(chǎng)模式的核心思想

  • 抽象工廠(chǎng)類(lèi):定義一個(gè)用于創(chuàng)建對(duì)象的接口,但讓子類(lèi)決定要實(shí)例化的類(lèi)是哪一個(gè)。工廠(chǎng)方法讓類(lèi)的實(shí)例化推遲到子類(lèi)中進(jìn)行。
  • 具體工廠(chǎng)類(lèi):提供具體對(duì)象創(chuàng)建的實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品類(lèi)。
  • 抽象產(chǎn)品類(lèi):定義一個(gè)產(chǎn)品的接口,是工廠(chǎng)方法所創(chuàng)建的對(duì)象的超類(lèi)型,也就是工廠(chǎng)方法所返回的類(lèi)型。
  • 具體產(chǎn)品類(lèi):實(shí)現(xiàn)了抽象產(chǎn)品接口的具體類(lèi)。

工廠(chǎng)模式的類(lèi)型

工廠(chǎng)模式主要分為三種類(lèi)型:簡(jiǎn)單工廠(chǎng)模式(Simple Factory Pattern)、工廠(chǎng)方法模式(Factory Method Pattern)和抽象工廠(chǎng)模式(Abstract Factory Pattern)。

簡(jiǎn)單工廠(chǎng)模式(Static Factory Method)

簡(jiǎn)單工廠(chǎng)模式并不屬于GoF的23種設(shè)計(jì)模式之一,但它常被用作引入工廠(chǎng)模式概念的起點(diǎn)。簡(jiǎn)單工廠(chǎng)模式通過(guò)一個(gè)工廠(chǎng)類(lèi)來(lái)創(chuàng)建具體的產(chǎn)品實(shí)例,通常使用靜態(tài)方法來(lái)實(shí)現(xiàn)。

優(yōu)點(diǎn):

  • 實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用的分離。
  • 客戶(hù)端不需要知道具體產(chǎn)品的類(lèi)名,只需要知道對(duì)應(yīng)的參數(shù)即可。

缺點(diǎn):

  • 工廠(chǎng)類(lèi)集中了所有產(chǎn)品的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則。
  • 增加新產(chǎn)品時(shí)需要修改工廠(chǎng)類(lèi)的判斷邏輯,違背了開(kāi)閉原則。

工廠(chǎng)方法模式(Factory Method)

工廠(chǎng)方法模式定義了一個(gè)創(chuàng)建對(duì)象的接口,但讓子類(lèi)決定要實(shí)例化的類(lèi)是哪一個(gè)。工廠(chǎng)方法讓類(lèi)的實(shí)例化推遲到子類(lèi)中進(jìn)行。

抽象產(chǎn)品類(lèi)(Product)

public interface Product {  
    void use();  
}

具體產(chǎn)品類(lèi)(ConcreteProductA, ConcreteProductB)

public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductA");  
    }  
}  
  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductB");  
    }  
}

抽象工廠(chǎng)類(lèi)(Creator)

public abstract class Creator {  
    public abstract Product factoryMethod();  
  
    // 模板方法  
    public void someOperation() {  
        Product product = factoryMethod();  
        product.use();  
    }  
}

具體工廠(chǎng)類(lèi)(ConcreteCreatorA, ConcreteCreatorB)

public class ConcreteCreatorA extends Creator {  
    @Override  
    public Product factoryMethod() {  
        return new ConcreteProductA();  
    }  
}  
  
public class ConcreteCreatorB extends Creator {  
    @Override  
    public Product factoryMethod() {  
        return new ConcreteProductB();  
    }  
}

客戶(hù)端代碼

public class Client {  
    public static void main(String[] args) {  
        Creator creatorA = new ConcreteCreatorA();  
        creatorA.someOperation(); // 輸出: Using ConcreteProductA  
  
        Creator creatorB = new ConcreteCreatorB();  
        creatorB.someOperation(); // 輸出: Using ConcreteProductB  
    }  
}

優(yōu)點(diǎn):

  • 用戶(hù)只需要知道具體工廠(chǎng)類(lèi)的類(lèi)型,就可以得到所需要的產(chǎn)品,無(wú)須知道具體產(chǎn)品類(lèi)的類(lèi)名。
  • 符合開(kāi)閉原則,新增一種產(chǎn)品時(shí),只需要增加相應(yīng)的具體產(chǎn)品類(lèi)和具體工廠(chǎng)類(lèi)即可,原有代碼無(wú)須修改。

缺點(diǎn):

  • 每增加一個(gè)產(chǎn)品,就需要增加一個(gè)具體產(chǎn)品類(lèi)和一個(gè)具體工廠(chǎng)類(lèi),增加了系統(tǒng)的復(fù)雜度。

抽象工廠(chǎng)模式(Abstract Factory)

抽象工廠(chǎng)模式提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴(lài)對(duì)象的家族,而不需要明確指定具體類(lèi)。

抽象產(chǎn)品類(lèi)(AbstractProductA, AbstractProductB)

public interface AbstractProductA {  
    void use();  
}  
  
public interface AbstractProductB {  
    void anotherMethod();  
}

具體產(chǎn)品類(lèi)(ConcreteProductA1, ConcreteProductA2, ConcreteProductB1, ConcreteProductB2)

public class ConcreteProductA1 implements AbstractProductA {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductA1");  
    }  
}  
  
public class ConcreteProductA2 implements AbstractProductA {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductA2");  
    }  
}  
  
// 同理實(shí)現(xiàn) ConcreteProductB1 和 ConcreteProductB2

抽象工廠(chǎng)類(lèi)(AbstractFactory)

public interface AbstractFactory {  
    AbstractProductA createProductA();  
    AbstractProductB createProductB();  
}

具體工廠(chǎng)類(lèi)(ConcreteFactory1, ConcreteFactory2)

public class ConcreteFactory1 implements AbstractFactory {  
    @Override  
    public AbstractProductA createProductA() {  
        return new ConcreteProductA1();  
    }  
  
    @Override  
    public AbstractProductB createProductB() {  
        return new ConcreteProductB1();  
    }  
}  
  
// 同理實(shí)現(xiàn) ConcreteFactory2

客戶(hù)端代碼

public class Client {  
    public static void main(String[] args) {  
        AbstractFactory factory1 = new ConcreteFactory1();  
        AbstractProductA productA1 = factory1.createProductA();  
        productA1.use(); // 輸出: Using ConcreteProductA1  
  
        AbstractProductB productB1 = factory1.createProductB();  
        // 假設(shè)有 anotherMethod 的實(shí)現(xiàn)  
        // productB1.anotherMethod();  
  
        // 可以根據(jù)需要使用 ConcreteFactory2 來(lái)創(chuàng)建不同的產(chǎn)品族  
    }  
}

優(yōu)點(diǎn):

  • 可以在類(lèi)的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束,保證客戶(hù)端始終只用到符合當(dāng)前業(yè)務(wù)邏輯的產(chǎn)品族。
  • 增加了系統(tǒng)的靈活性和可擴(kuò)展性,新增產(chǎn)品族時(shí),只需要增加相應(yīng)的具體工廠(chǎng)類(lèi)和具體產(chǎn)品類(lèi)即可。

缺點(diǎn):

  • 增加了系統(tǒng)的抽象性和理解難度。
  • 客戶(hù)端需要依賴(lài)抽象層,增加了客戶(hù)端與抽象層之間的耦合。

你對(duì)工廠(chǎng)模式了解了嗎?

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2021-03-06 22:50:58

設(shè)計(jì)模式抽象

2020-08-21 07:23:50

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

2022-01-12 13:33:25

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

2011-11-17 16:03:05

Java工廠(chǎng)模式Clojure

2020-10-19 09:28:00

抽象工廠(chǎng)模式

2021-09-29 13:53:17

抽象工廠(chǎng)模式

2010-04-19 09:30:00

工廠(chǎng)模式PHP設(shè)計(jì)模式

2022-05-09 08:04:50

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

2013-11-26 16:29:22

Android設(shè)計(jì)模式

2009-01-15 10:55:29

JavaScript設(shè)計(jì)模式抽象工廠(chǎng)

2010-10-09 09:25:35

Python工廠(chǎng)模式

2014-03-11 11:35:00

.NETC#

2020-12-17 09:38:16

設(shè)計(jì)模式參數(shù)

2024-09-14 08:24:44

設(shè)計(jì)模式抽象工廠(chǎng)模式JDK

2019-08-16 10:46:46

JavaScript工廠(chǎng)模式抽象工廠(chǎng)模式

2011-07-28 09:50:58

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

2015-11-03 09:43:43

avascript設(shè)計(jì)模式工廠(chǎng)模式

2024-02-20 12:09:32

模式工廠(chǎng)方法接口

2023-03-27 00:20:48

2012-08-30 09:07:33

設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)