国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文搞懂設(shè)計模式—工廠方法模式

開發(fā) 前端
工廠方法模式屬于創(chuàng)建型模式,通過定義一個用于創(chuàng)建對象的接口,將具體的實例化延遲到子類中,提供了一種靈活、可擴展的對象創(chuàng)建方式,使得系統(tǒng)更加符合開閉原則。

在面向?qū)ο笤O(shè)計中,經(jīng)常需要創(chuàng)建對象實例。傳統(tǒng)的方式是在代碼中直接使用 new 關(guān)鍵字來創(chuàng)建對象,但這種方式可能會導(dǎo)致高耦合和難以擴展。

工廠方法模式屬于創(chuàng)建型模式,通過定義一個用于創(chuàng)建對象的接口,將具體的實例化延遲到子類中,提供了一種靈活、可擴展的對象創(chuàng)建方式,使得系統(tǒng)更加符合開閉原則。

使用場景

工廠方法模式適用于以下場景:

  • 對象的創(chuàng)建過程比較復(fù)雜,包含一系列步驟或依賴關(guān)系,需要隱藏創(chuàng)建細節(jié),只關(guān)注對象的使用。
  • 需要在運行時動態(tài)決定創(chuàng)建哪個具體對象。
  • 希望通過擴展工廠類來添加新的產(chǎn)品,而不是修改已有的代碼。

一個常見的工廠方法模式在 Spring 中的應(yīng)用例子是通過 FactoryBean 接口來創(chuàng)建自定義的工廠 Bean。

假設(shè)我們有一個名為 UserService 的服務(wù)類,它依賴于另一個名為 UserRepository 的數(shù)據(jù)訪問對象。我們可以使用工廠方法模式來創(chuàng)建 UserService 實例,并將其作為一個 Bean 注冊到 Spring 容器中。

首先,我們創(chuàng)建一個實現(xiàn)了 FactoryBean<UserService> 接口的工廠類 UserServiceFactory:

public class UserServiceFactory implements FactoryBean<UserService> {
    private UserRepository userRepository;

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserService getObject() throws Exception {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository);
        return userService;
    }

    @Override
    public Class<?> getObjectType() {
        return UserService.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

在上述代碼中,UserServiceFactory 實現(xiàn)了 FactoryBean<UserService> 接口,并重寫了相關(guān)方法。在 getObject() 方法中,我們創(chuàng)建了一個 UserService實例,并設(shè)置了其依賴的 UserRepository。getObjectType() 方法返回了工廠創(chuàng)建的對象類型,isSingleton() 方法表示該工廠創(chuàng)建的對象是否為單例。

接下來,我們需要將 UserServiceFactory 和 UserRepository 注冊到Spring容器中??梢酝ㄟ^XML配置文件進行配置:

<bean id="userRepository" class="com.example.UserRepository"/>

<bean id="userServiceFactory" class="com.example.UserServiceFactory">
    <property name="userRepository" ref="userRepository"/>
</bean>

<bean id="userService" factory-bean="userServiceFactory" factory-method="getObject"/>

在上述配置中,我們首先創(chuàng)建了一個 UserRepository 的Bean,并將其注入到 UserServiceFactory 工廠類中。然后,通過 factory-bean 屬性指定使用userServiceFactory 工廠來創(chuàng)建 userService 的實例。

這樣,當Spring容器初始化時,會自動調(diào)用 UserServiceFactory 的 getObject() 方法來創(chuàng)建 UserService 實例,并將其作為一個 Bean 注冊到容器中??梢酝ㄟ^ @Autowired 或其他方式來注入 UserService 對象,并使用它的服務(wù)。

通過這種方式,我們成功地應(yīng)用了工廠方法模式,在 Spring 中管理和創(chuàng)建了 UserService 實例,并解耦了對象的創(chuàng)建和依賴注入過程。

具體實現(xiàn)

工廠方法模式涉及以下幾個角色:

  • 抽象產(chǎn)品(Abstract Product):定義了產(chǎn)品的抽象接口或抽象類,具體產(chǎn)品需要實現(xiàn)這個接口或繼承這個抽象類。
  • 具體產(chǎn)品(Concrete Product):實現(xiàn)了抽象產(chǎn)品定義的接口或繼承抽象產(chǎn)品的抽象類,是工廠方法模式所創(chuàng)建的對象。
  • 抽象工廠(Abstract Factory):定義了一個創(chuàng)建產(chǎn)品對象的抽象工廠接口,其中包含了創(chuàng)建產(chǎn)品的抽象方法。
  • 具體工廠(Concrete Factory):實現(xiàn)了抽象工廠接口,負責(zé)創(chuàng)建具體的產(chǎn)品對象。具體工廠類通常含有與業(yè)務(wù)相關(guān)的邏輯,并在工廠方法中實例化具體產(chǎn)品對象。

在工廠方法模式中,抽象工廠和抽象產(chǎn)品是核心,而具體工廠和具體產(chǎn)品則根據(jù)實際需求進行擴展和實現(xiàn)。

通過這些角色的協(xié)作,工廠方法模式實現(xiàn)了將產(chǎn)品的創(chuàng)建過程封裝起來,使得客戶端與具體產(chǎn)品解耦,同時也提供了靈活性和可擴展性。

抽象產(chǎn)品類和具體產(chǎn)品類

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

public abstract class Product {
    public abstract void use();
}

然后創(chuàng)建具體產(chǎn)品類,如 ConcreteProductA 和 ConcreteProductB,它們分別繼承自 Product 并實現(xiàn)了其中的抽象方法。

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

抽象工廠類和具體工廠類

接下來定義一個抽象工廠類  Factory,其中包含一個抽象的工廠方法 createProduct(),用于創(chuàng)建具體的產(chǎn)品對象:

public abstract class Factory {
    public abstract Product createProduct();
}

對于每個具體產(chǎn)品,創(chuàng)建相應(yīng)的具體工廠類:

public class ConcreteFactoryA extends Factory {
    
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
public class ConcreteFactoryB extends Factory {
    
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

客戶端代碼

在客戶端代碼中,我們可以根據(jù)需要選擇不同的具體工廠類來創(chuàng)建產(chǎn)品對象。

public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactoryA();
        Product product = factory.createProduct();
        product.use();
    }
}

通過工廠方法模式,我們將對象的創(chuàng)建過程分散到不同的具體工廠類中,每個具體工廠類只負責(zé)創(chuàng)建對應(yīng)的產(chǎn)品對象。這樣可以降低代碼的耦合度,同時也方便添加新的產(chǎn)品和工廠。

優(yōu)點

  • 符合開閉原則:工廠方法模式將產(chǎn)品的創(chuàng)建過程封裝在具體工廠類中,新增產(chǎn)品時只需添加對應(yīng)的工廠類,而無需修改已有的代碼。
  • 客戶端與具體產(chǎn)品解耦:客戶端代碼只和抽象工廠類以及抽象產(chǎn)品類交互,無需關(guān)心具體的實現(xiàn)細節(jié),從而實現(xiàn)了高層模塊和底層模塊的解耦。
  • 擴展性好:通過添加新的具體工廠類和具體產(chǎn)品類,可以靈活地擴展系統(tǒng),符合開放封閉原則。
  • 容易進行單元測試:由于工廠方法模式將對象的創(chuàng)建過程封裝到具體工廠類中,我們可以輕松地替換具體工廠類來進行單元測試,提高代碼的可測試性。

缺點

  • 類的數(shù)量增加:引入工廠方法模式會增加類的數(shù)量,增加了系統(tǒng)的復(fù)雜度。
  • 增加了系統(tǒng)的抽象性和理解難度:相比于簡單工廠模式,工廠方法模式引入了更多的抽象類和接口,對于初學(xué)者來說可能更難理解。

注意:工廠方法模式適合復(fù)雜對象,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度。

簡單工廠模式

當只有少量具體產(chǎn)品類時,并且對象的創(chuàng)建邏輯相對簡單,沒有必要為每個具體產(chǎn)品類創(chuàng)建一個對應(yīng)的工廠類,此時使用簡單工廠模式會更加簡潔和直觀。

簡單工廠模式(Simple Factory Pattern)是工廠方法模式的弱化。

簡單工廠模式由三個主要角色組成:

  • 工廠類(Factory Class):負責(zé)創(chuàng)建對象的核心類,它通常包含一個靜態(tài)方法或者非靜態(tài)方法,根據(jù)客戶端傳入的參數(shù)來創(chuàng)建相應(yīng)的對象實例。
  • 抽象產(chǎn)品類(Abstract Product Class):定義了具體產(chǎn)品類的共同接口或抽象類,描述了產(chǎn)品的通用行為。
  • 具體產(chǎn)品類(Concrete Product Class):實現(xiàn)了抽象產(chǎn)品類所定義的接口或抽象類,具體產(chǎn)品類是工廠類所創(chuàng)建的目標對象。

下面是一個簡單的示例代碼,演示了簡單工廠模式的實現(xiàn):

// 抽象產(chǎn)品類
public interface Animal {
    void speak();
}

// 具體產(chǎn)品類1
public class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println("Meow!");
    }
}

// 具體產(chǎn)品類2
public class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println("Woof!");
    }
}

// 工廠類
public class AnimalFactory {
    public static Animal createAnimal(String type) {
        if (type.equalsIgnoreCase("cat")) {
            return new Cat();
        } else if (type.equalsIgnoreCase("dog")) {
            return new Dog();
        }
        throw new IllegalArgumentException("Invalid animal type: " + type);
    }
}

在上述代碼中,我們定義了一個抽象產(chǎn)品類 Animal,并有兩個具體產(chǎn)品類 Cat 和 Dog,它們都實現(xiàn)了 Animal 接口。工廠類 AnimalFactory 負責(zé)根據(jù)客戶端傳入的參數(shù)創(chuàng)建相應(yīng)的具體產(chǎn)品對象。

使用簡單工廠模式,客戶端可以通過調(diào)用工廠類的靜態(tài)方法 createAnimal() 來獲取所需的具體產(chǎn)品對象。例如:

Animal cat = AnimalFactory.createAnimal("cat");
cat.speak();  // 輸出:Meow!

Animal dog = AnimalFactory.createAnimal("dog");
dog.speak();  // 輸出:Woof!

簡單工廠模式因為工廠類定義了一個靜態(tài)方法,因此也叫做靜態(tài)工廠模式。其缺點是工廠類的擴展比較困難,不符合開閉原則,并且隨著產(chǎn)品類型增多,簡單工廠模式工廠類的代碼可能會變得復(fù)雜,因此不適用于大規(guī)模或復(fù)雜的應(yīng)用程序,但它仍然是一個非常實用的設(shè)計模式。

延遲初始化

延遲初始化:一個對象被消費完畢后,并不立刻釋放,工廠類保持其初始狀態(tài),等待再次被使用。

延遲加載的工廠類,參考代碼如下:

public class ProductFactory {
    private static final Map<String, Product> prMap = new HashMap();

    public static synchronized Product createProduct(String type) throws Exception {
        Product product = null;
  //如果Map中已經(jīng)有這個對象
        if (prMap.containsKey(type)) {
            product = prMap.get(type);
        } else {
            if (type.equals("Product1")) {
                product = new ConcreteProduct1();
            } else {
                product = new ConcreteProduct2();
            }
  //同時把對象放到緩存容器中
            prMap.put(type, product);
        }
        return product;
    }
}

代碼算是比較簡單,通過定義一個Map容器,容納所有產(chǎn)生的對象,如果在Map容器中已經(jīng)有的對象,則直接取出返回;如果沒有,則根據(jù)需要的類型產(chǎn)生一個對象并放入到Map容器中,以方便下次調(diào)用。

這樣的好處是可以限制某一個產(chǎn)品類的最大實例化數(shù)量,通過判斷Map中已有的對象數(shù)量來實現(xiàn)。

延遲加載在對象初始化比較復(fù)雜的情況下,可以降低對象的產(chǎn)生和銷毀帶來的復(fù)雜性。這是非常有意義的,例如 JDBC 連接數(shù)據(jù)庫,都會要求設(shè)置一個 MaxConnections 最大連接數(shù)量,該數(shù)量就是內(nèi)存中最大實例化的數(shù)量。

總結(jié)

工廠方法模式使用的頻率非常高,工廠方法模式通過定義抽象工廠類和抽象產(chǎn)品類,將對象的創(chuàng)建委托給子類來實現(xiàn)。它提供了一種靈活、可擴展的對象創(chuàng)建方式,符合開閉原則,并且降低了代碼的耦合度。

通過合理地使用工廠方法模式,我們可以提高代碼的靈活性、可擴展性和可維護性,從而構(gòu)建更優(yōu)秀的軟件系統(tǒng)。

責(zé)任編輯:武曉燕 來源: Java隨想錄
相關(guān)推薦

2024-02-21 12:24:33

模板設(shè)計模式框架

2024-02-26 11:52:38

代理模式設(shè)計

2024-01-29 12:22:07

設(shè)計模式策略模式

2024-02-19 13:11:38

門面模式系統(tǒng)

2024-02-27 11:59:12

享元模式對象

2024-02-04 12:04:17

2024-01-30 13:15:00

設(shè)計模式責(zé)任鏈

2024-02-23 12:11:53

裝飾器模式對象

2023-05-22 13:27:17

2013-11-26 16:29:22

Android設(shè)計模式

2010-10-09 09:25:35

Python工廠模式

2024-02-18 12:36:09

2024-02-22 12:13:49

適配器模式代碼

2020-08-11 11:20:30

Typescript設(shè)計模式

2009-01-15 10:55:29

JavaScript設(shè)計模式抽象工廠

2022-05-05 16:47:24

Docker網(wǎng)絡(luò)空間容器

2023-08-05 13:31:20

工廠方法模式對象

2022-09-21 16:56:16

設(shè)計模式微服務(wù)架構(gòu)

2023-09-11 08:30:30

Creator工廠方法

2021-03-06 22:50:58

設(shè)計模式抽象
點贊
收藏

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

欧美成人精品一区二区三区| 久久国产成人精品| 26uuu久久综合| 欧美影院一区二区三区| 一个人www欧美| 老司机性视频| 在线成人直播| 国产亚洲欧洲高清一区| 超碰免费在线观看| 狠狠88综合久久久久综合网| 99精品国产福利在线观看免费 | 精品久久久久久久久久ntr影视| 亚洲日本成人在线观看| 亚洲欧洲xxxx| 蜜桃在线视频| 国产日韩高清在线| 日韩激情视频在线| 91久久国产综合久久蜜月精品| 国产性xxxx18免费观看视频| 综合伊思人在钱三区| 狠狠色丁香久久婷婷综| www激情久久| 91美女精品福利| 亚洲第一天堂无码专区| 欧美日韩和欧美的一区二区| 91午夜在线播放| 亚洲最大黄色| 六月丁香婷婷激情| 高清一区二区中文字幕| 影音先锋中文字幕一区二区| 在线观看网站黄不卡| 国产热re99久久6国产精品| 亚洲人成77777| av久久网站| 精品一区二区在线看| 亚洲精品xxxx| 欧美视频观看一区| av免费高清观看| 亚洲精品系列| 精品视频在线视频| 在线观看av中文| 亚洲综合不卡| 欧美日韩在线视频一区| 狠狠色一日本高清视频| 尤物视频一区二区| 不卡在线视频| 日韩一区二区三区在线观看 | 国产成人综合美国十次| 亚洲高清视频在线| 精品伦理一区二区| 91福利社在线观看| 成人免费看黄| 久久久久久久影院| 久久久久久毛片免费看| 91最新在线免费观看| 在线播放精品| 岛国大片在线播放| 精品国产91乱高清在线观看| 粉嫩av国产一区二区三区| 亚洲va电影大全| 精品一区精品二区高清| 中文字幕第88页| 中文字幕亚洲字幕| 国产成人精品999在线观看| 色播亚洲婷婷| 动漫精品一区二区| 盗摄系列偷拍视频精品tp| 综合色婷婷一区二区亚洲欧美国产| 综合亚洲深深色噜噜狠狠网站| 欧美极品免费| 极品尤物一区二区三区| 久久蜜桃av一区精品变态类天堂| 国产福利视频在线| 国产www精品| 亚洲精品一二三四区| 国产精品专区免费| 亚洲资源视频| 亚洲欧美日韩国产中文| 久久成人综合网| 99在线免费观看| 亚州国产精品久久久| 麻豆91小视频| 亚洲第一色中文字幕| 日韩国产一区| 极品白浆推特女神在线观看| 国产有码在线一区二区视频| 精品福利一区二区| 国产aa精品| 人禽交欧美网站免费| 欧美日韩国产一中文字不卡| 亚洲国产aⅴ精品一区二区| 69久久久久久| 91久久综合亚洲鲁鲁五月天| 一本久道中文字幕精品亚洲嫩| 欧美精品网站| a级片在线免费| 国产一区一区三区| 欧美人交a欧美精品| 亚洲精品v日韩精品| 黄色成人在线视频| 精品亚洲一区二区三区四区| 97视频在线观看视频免费视频| 久久精品中文| 国产日韩欧美中文在线| 国产免费av高清在线| 欧美xxxx吸乳| 日韩女优电影在线观看| 91网页版在线| 免费av一区二区三区四区| 香艳视频网站| 国产精品露出视频| 久久夜色精品国产| 91精品国产91热久久久做人人| 国产一区美女在线| 日韩精品成人| 少妇一级淫免费播放| 高清国产一区| 久久久久久网址| 色综合 综合色| 日本视频免费一区| 久久精品免视看国产成人| 三上悠亚在线资源| 久久精品国产美女| 日韩精品一区二区三区四区视频| 99久久99久久综合| 日韩国产一区二| 国产精品久久久久久麻豆一区软件| a视频在线看| www.国产区| 日韩一二区视频| 国产三级精品在线不卡| 国产精品久久久久一区二区| 欧美激情一区二区三区在线视频观看 | 国产一区二区三区日韩精品| 外国精品视频在线观看| 加勒比在线日本| 国内外成人在线视频| 国产精品**亚洲精品| 超碰99在线| 88xx成人永久免费观看| 色婷婷综合久久久久中文一区二区| 国产精品一国产精品| 国产精品免费精品自在线观看| 神马伦理电影| www成人免费视频| a级黄色小视频| 日韩精品第1页| 中日韩在线视频| 国产一区二区三区在线免费| 精品国产_亚洲人成在线| 亚洲字幕一区二区| 亚洲一区二区三区xxx视频| 欧美性受xxxx白人性爽| 欧美精品免费播放| 久久久精品电影| 九九精品在线视频| 2018中文字幕一区二区三区| 国产97在线亚洲| 国产精品中文在线| 1区1区3区4区产品乱码芒果精品| 欧美又大粗又爽又黄大片视频| 国产精品v片在线观看不卡| 51久久精品夜色国产麻豆| 91中文在线观看| 国产成人jvid在线播放| 91久久久一线二线三线品牌| 欧美自拍资源在线| 成人观看免费完整观看| 黄色三级视频片| 国产青青草在线| 视频在线日韩| 在线观看午夜av| 2019中文亚洲字幕| 一区二区日韩| 亚洲综合小说| bt欧美亚洲午夜电影天堂| 亚洲色图.com| 一区二区三区中文在线| 粉嫩av一区二区三区免费野| 欧美剧在线免费观看网站| 久久香蕉国产线看观看av| 国产日韩欧美日韩| 精品高清视频| 黄色三级电影网| 亚洲三级欧美| 136国产福利精品导航网址| 美女一区二区三区| 亚洲老司机在线| 伊人精品在线观看| 精品日本一区二区三区在线观看| 肥女人的一级毛片| 欧美free嫩15| 国内精品久久久久影院一蜜桃| 色狠狠av一区二区三区| **欧美日韩vr在线| 日韩三级电影免费观看| 国产对白在线播放| 韩国精品久久久| 亚洲**毛片| 亚洲日本免费电影|