欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java工廠模式優(yōu)雅地創(chuàng)建對象以及提高代碼復(fù)用率和靈活性

 更新時間:2023年05月04日 09:18:06   作者:.番茄炒蛋  
Java工廠模式是一種創(chuàng)建型設(shè)計模式,通過定義一個工廠類來封裝對象的創(chuàng)建過程,將對象的創(chuàng)建和使用分離,提高代碼的可維護性和可擴展性,同時可以實現(xiàn)更好的代碼復(fù)用和靈活性

介紹

Java工廠設(shè)計模式主要分為三種:

簡單工廠模式(Simple Factory Pattern):使用一個工廠類來封裝對象創(chuàng)建的過程,客戶端只需要通過傳遞不同的參數(shù)來獲取不同的產(chǎn)品對象,從而避免了客戶端直接創(chuàng)建產(chǎn)品對象的操作

工廠方法模式(Factory Method Pattern):將工廠類抽象出來,每個具體產(chǎn)品類對應(yīng)一個具體工廠類,工廠類通過多態(tài)性來創(chuàng)建對應(yīng)的產(chǎn)品對象,客戶端只需要知道工廠接口及其實現(xiàn)類即可,可以根據(jù)需求動態(tài)切換工廠實現(xiàn),擴展性更好.

抽象工廠模式(Abstract Factory Pattern):在工廠方法模式的基礎(chǔ)上,將工廠類再進行一次抽象,將多個工廠接口放到一個工廠接口中,每個具體產(chǎn)品對應(yīng)一個具體工廠類,通過多態(tài)性來創(chuàng)建對應(yīng)的產(chǎn)品對象,具有更好的擴展性和更高的抽象程度,但是也增加了系統(tǒng)復(fù)雜度

簡單工廠模式

首先先定義一個抽象產(chǎn)品類:

package com.fanqiechaodan.factory.simple.product;
/**
 * @Classname Product
 * @Description 抽象產(chǎn)品類
 */
public abstract class Product {
    public abstract void use();
}

然后定義具體產(chǎn)品類

public class ProductA extends Product{
    @Override
    public void use() {
        System.out.println("使用具體產(chǎn)品類A...");
    }
}
public class ProductB extends Product{
    @Override
    public void use() {
        System.out.println("使用具體產(chǎn)品類B...");
    }
}
public class ProductC extends Product{
    @Override
    public void use() {
        System.out.println("使用具體產(chǎn)品類C...");
    }
}

接下來定義工廠類,用于創(chuàng)建不同的產(chǎn)品

package com.fanqiechaodan.factory.simple.factory;
import com.fanqiechaodan.factory.simple.product.Product;
import com.fanqiechaodan.factory.simple.product.ProductA;
import com.fanqiechaodan.factory.simple.product.ProductB;
import com.fanqiechaodan.factory.simple.product.ProductC;
/**
 * @Classname SimpleFactory
 * @Description 工廠類
 */
public class SimpleFactory {
    public static Product createProduct(String type) {
        switch (type) {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            case "C":
                return new ProductC();
            default:
                throw new RuntimeException("不支持的產(chǎn)品類型:" + type);
        }
    }
}

測試:

package com.fanqiechaodan.factory.simple;
import com.fanqiechaodan.factory.simple.factory.SimpleFactory;
import com.fanqiechaodan.factory.simple.product.Product;
/**
 * @Classname Demo
 * @Description 簡單工廠模式
 */
public class Demo {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.use();
        Product productB = SimpleFactory.createProduct("B");
        productB.use();
        Product productC = SimpleFactory.createProduct("C");
        productC.use();
        Product productD = SimpleFactory.createProduct("D");
        productD.use();
    }
}

工廠方法模式

首先定義一個接口表示產(chǎn)品

package com.fanqiechaodan.factory.method.product;
/**
 * @Classname Product
 * @Description 產(chǎn)品接口
 */
public interface Product {
    void use();
}

其次定義兩個具體的產(chǎn)品實現(xiàn)類

public class ProductA implements Product{
    @Override
    public void use() {
        System.out.println("使用具體產(chǎn)品A...");
    }
}
public class ProductB implements Product{
    @Override
    public void use() {
        System.out.println("使用具體產(chǎn)品B...");
    }
}

然后定義一個工廠接口用于創(chuàng)建產(chǎn)品

package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
/**
 * @Classname Factory
 * @Description 工廠接口
 */
public interface Factory {
    Product createProduct();
}

接下來,定義兩個具體的工廠實現(xiàn)類,分別用于創(chuàng)建不同的產(chǎn)品

public class FactoryA implements Factory{
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
public class FactoryB implements Factory{
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

測試

package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
import com.fanqiechaodan.factory.method.product.ProductB;
/**
 * @Classname FactoryB
 * @Description 工廠實現(xiàn)類B
 */
public class FactoryB implements Factory{
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

抽象工廠模式

首先定義抽象產(chǎn)品

public interface ProductA {
    void doSomething();
}
public interface ProductB {
    void doSomething();
}

其次定義具體產(chǎn)品

public class ProductA1 implements ProductA{
    @Override
    public void doSomething() {
        System.out.println("ProductA1 doSomething ...");
    }
}
public class ProductA2 implements ProductA{
    @Override
    public void doSomething() {
        System.out.println("ProductA2 doSomething ...");
    }
}
public class ProductB1 implements ProductB{
    @Override
    public void doSomething() {
        System.out.println("ProductB1 doSomething ...");
    }
}
public class ProductB2 implements ProductB{
    @Override
    public void doSomething() {
        System.out.println("ProductB2 doSomething ...");
    }
}

然后定義抽象工廠

package com.fanqiechaodan.factory.abstractfactory.factory;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
 * @Classname AbstractFactory
 * @Description 抽象工廠
 */
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

接下來定義具體工廠

public class Factory1 implements AbstractFactory{
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }
    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}
public class Factory2 implements AbstractFactory{
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }
    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

測試

package com.fanqiechaodan.factory.abstractfactory;
import com.fanqiechaodan.factory.abstractfactory.factory.AbstractFactory;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory1;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory2;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
 * @Classname Demo
 * @Description 抽象工廠模式
 */
public class Demo {
    public static void main(String[] args) {
        // 使用具體工廠1創(chuàng)建產(chǎn)品A和產(chǎn)品B
        AbstractFactory factory1 = new Factory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.doSomething();
        productB1.doSomething();
        // 使用具體工廠2創(chuàng)建產(chǎn)品A和產(chǎn)品B
        AbstractFactory factory2 = new Factory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.doSomething();
        productB2.doSomething();
    }
}

總結(jié)

簡單工廠模式

優(yōu)點:

  • 簡單易用,客戶端只需要知道工廠類和產(chǎn)品類即可
  • 工廠類負責(zé)創(chuàng)建對象,客戶端無需知道具體得實現(xiàn)細節(jié)
  • 可以根據(jù)參數(shù)動態(tài)創(chuàng)建對象

缺點:

  • 工廠類負責(zé)創(chuàng)建所有得產(chǎn)品對象,當產(chǎn)品類型過多時,工廠類會變得十分臃腫
  • 添加新產(chǎn)品需要修改工廠類的代碼,違反了開閉原則

工廠方法模式

優(yōu)點:

  • 將每個產(chǎn)品類型的創(chuàng)建部分分散到具體的工廠類中,避免了簡單工廠模式中工廠類臃腫的問題
  • 添加新產(chǎn)品只需要添加具體工廠類即可,符合開閉原則

缺點:

  • 客戶端需要知道所有具體工廠類,使用起來不夠靈活
  • 每個產(chǎn)品類型都需要對應(yīng)一個具體的工廠類,增加了系統(tǒng)類的個數(shù),增加了系統(tǒng)的復(fù)雜度

抽象工廠模式

優(yōu)點:

  • 可以創(chuàng)建一組相關(guān)的產(chǎn)品對象,確保這些對象之間的兼容性
  • 隱藏了產(chǎn)品對象的具體實現(xiàn),客戶端只需要知道抽象工廠和抽象產(chǎn)品即可
  • 可以通過替換具體工廠來實現(xiàn)不同的產(chǎn)品組合,提高了系統(tǒng)的靈活性

缺點;

  • 增加了系統(tǒng)的抽象性和復(fù)雜度,需要定義多個抽象工廠接口和多個具體工廠類
  • 不容易支持新種類的產(chǎn)品,需要添加新的產(chǎn)品工廠接口和具體工廠類

到此這篇關(guān)于Java工廠模式優(yōu)雅地創(chuàng)建對象以及提高代碼復(fù)用率和靈活性的文章就介紹到這了,更多相關(guān)Java工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot使用PropertiesLauncher加載外部jar包

    SpringBoot使用PropertiesLauncher加載外部jar包

    這篇文章主要介紹了SpringBoot使用PropertiesLauncher加載外部jar包,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 深入了解java中的string對象

    深入了解java中的string對象

    這篇文章主要介紹了java中的string對象,String對象是Java中使用最頻繁的對象之一,所以Java開發(fā)者們也在不斷地對String對象的實現(xiàn)進行優(yōu)化,以便提升String對象的性能。對此感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • IDEA修改SVN地址的實現(xiàn)

    IDEA修改SVN地址的實現(xiàn)

    如果你正在使用SVN進行版本控制,并且需要更改你的SVN地址,那么這篇文章將為你提供必要的步驟和指導(dǎo),感興趣的可以了解一下
    2023-12-12
  • Java中Prime算法的原理與實現(xiàn)詳解

    Java中Prime算法的原理與實現(xiàn)詳解

    Prime算法是一種窮舉查找算法來從一個連通圖中構(gòu)造一棵最小生成樹。本文主要為大家介紹了Java中Prime算法的原理與實現(xiàn),感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • 詳解Java的JDBC中Statement與PreparedStatement對象

    詳解Java的JDBC中Statement與PreparedStatement對象

    這篇文章主要介紹了詳解Java的JDBC中Statement與PreparedStatement對象,PreparedStatement一般來說比使用Statement效率更高,需要的朋友可以參考下
    2015-12-12
  • java運行shell腳本方法示例

    java運行shell腳本方法示例

    利用Runtime.execute方法,我們可以在Java程序中運行Linux的Shell腳本,或者執(zhí)行其他程序
    2013-12-12
  • JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解

    JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解

    這篇文章主要介紹了JAVA加密算法數(shù)字簽名實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 關(guān)于feign對x-www-form-urlencode類型的encode和decode問題

    關(guān)于feign對x-www-form-urlencode類型的encode和decode問題

    這篇文章主要介紹了關(guān)于feign對x-www-form-urlencode類型的encode和decode問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SharedingSphere?自定義脫敏規(guī)則介紹

    SharedingSphere?自定義脫敏規(guī)則介紹

    這篇文章主要介紹了SharedingSphere?自定義脫敏規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java連接orcale數(shù)據(jù)庫示例分享

    java連接orcale數(shù)據(jù)庫示例分享

    這篇文章主要介紹了java連接orcale數(shù)據(jù)庫示例,需要的朋友可以參考下
    2014-02-02

最新評論