精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文搞懂設計模式—工廠方法模式

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

在面向對象設計中,經常需要創建對象實例。傳統的方式是在代碼中直接使用 new 關鍵字來創建對象,但這種方式可能會導致高耦合和難以擴展。

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

使用場景

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

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

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

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

首先,我們創建一個實現了 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 實現了 FactoryBean<UserService> 接口,并重寫了相關方法。在 getObject() 方法中,我們創建了一個 UserService實例,并設置了其依賴的 UserRepository。getObjectType() 方法返回了工廠創建的對象類型,isSingleton() 方法表示該工廠創建的對象是否為單例。

接下來,我們需要將 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"/>

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

這樣,當Spring容器初始化時,會自動調用 UserServiceFactory 的 getObject() 方法來創建 UserService 實例,并將其作為一個 Bean 注冊到容器中。可以通過 @Autowired 或其他方式來注入 UserService 對象,并使用它的服務。

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

具體實現

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

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

在工廠方法模式中,抽象工廠和抽象產品是核心,而具體工廠和具體產品則根據實際需求進行擴展和實現。

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

抽象產品類和具體產品類

首先定義一個抽象產品類 Product:

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

然后創建具體產品類,如 ConcreteProductA 和 ConcreteProductB,它們分別繼承自 Product 并實現了其中的抽象方法。

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(),用于創建具體的產品對象:

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

對于每個具體產品,創建相應的具體工廠類:

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

客戶端代碼

在客戶端代碼中,我們可以根據需要選擇不同的具體工廠類來創建產品對象。

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

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

優點

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

缺點

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

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

簡單工廠模式

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

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

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

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

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

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

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

// 具體產品類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);
    }
}

在上述代碼中,我們定義了一個抽象產品類 Animal,并有兩個具體產品類 Cat 和 Dog,它們都實現了 Animal 接口。工廠類 AnimalFactory 負責根據客戶端傳入的參數創建相應的具體產品對象。

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

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

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

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

延遲初始化

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

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

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中已經有這個對象
        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容器,容納所有產生的對象,如果在Map容器中已經有的對象,則直接取出返回;如果沒有,則根據需要的類型產生一個對象并放入到Map容器中,以方便下次調用。

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

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

總結

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

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

責任編輯:武曉燕 來源: Java隨想錄
相關推薦

2024-02-21 12:24:33

模板設計模式框架

2024-01-29 12:22:07

設計模式策略模式

2024-02-19 13:11:38

門面模式系統

2024-02-26 11:52:38

代理模式設計

2023-05-22 13:27:17

2024-02-23 12:11:53

裝飾器模式對象

2024-01-30 13:15:00

設計模式責任鏈

2024-02-27 11:59:12

享元模式對象

2024-02-04 12:04:17

2013-11-26 16:29:22

Android設計模式

2010-10-09 09:25:35

Python工廠模式

2024-02-22 12:13:49

適配器模式代碼

2024-02-18 12:36:09

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2020-08-11 11:20:30

Typescript設計模式

2022-05-05 16:47:24

Docker網絡空間容器

2023-08-05 13:31:20

工廠方法模式對象

2022-09-21 16:56:16

設計模式微服務架構

2022-01-12 13:33:25

工廠模式設計

2023-09-11 08:30:30

Creator工廠方法
點贊
收藏

51CTO技術棧公眾號

蜜桃一区二区三区四区| 精品视频免费| 日韩欧美亚洲国产一区| 色综合影院在线观看| 99热这里只有精| 亚洲伦理精品| 日韩在线中文视频| 野战少妇38p| 欧美日韩五区| 亚洲.国产.中文慕字在线| 日韩高清三级| 天堂v在线观看| 久久99精品久久久久婷婷| 久久免费高清视频| 一区二区三区在线播放视频| 丁香综合av| 欧美日韩电影在线播放| 国产精品沙发午睡系列| 国产成人l区| 久久久一区二区三区| 亚洲xxx视频| 嫩草影院一区二区三区| 亚洲福利电影| 欧美尺度大的性做爰视频| 人妻少妇无码精品视频区| ady日本映画久久精品一区二区| 欧美图片一区二区三区| 国产黄视频在线| 色呦呦在线资源| 中文字幕制服丝袜成人av| 欧美成人综合一区| 少妇精品视频一区二区| 国产成人精品亚洲午夜麻豆| 国产一区二区在线免费视频| 免费污污视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| x99av成人免费| 国产又粗又硬视频| 最新亚洲精品| 精品视频久久久| 久久久高清视频| 日韩一区二区三区高清在线观看| 欧美日韩1区2区| 中文字幕第80页| 日本美女一区| 日本韩国欧美一区二区三区| 国产精品后入内射日本在线观看| 爱看av在线| 亚洲v精品v日韩v欧美v专区| 精品一二三四五区| 欧美人与动牲性行为| 亚洲免费在线观看视频| 日本女人高潮视频| caopeng在线| 夜色激情一区二区| 免费看毛片的网址| zzzwww在线看片免费| 精品福利一区二区| 国产中文字幕免费观看| xx欧美视频| 色先锋久久av资源部| 日韩手机在线观看视频| 日韩经典一区| 欧美浪妇xxxx高跟鞋交| 亚洲第一成肉网| 澳门精品久久国产| 亚洲精品国产综合久久| 国产精品久久AV无码| 少妇精品导航| 中文字幕亚洲综合久久| 欧美一级特黄高清视频| 中文字幕一区二区三区在线视频| 欧美裸身视频免费观看| 日韩av男人天堂| 日韩电影在线免费看| 成人黄色在线播放| 丁香六月色婷婷| 久久亚洲精品小早川怜子| 日韩精品一区二区三区外面| 永久av在线| 一区二区免费看| 亚洲 高清 成人 动漫| 色综合天天色| 欧美一区二区三区成人| 给我免费观看片在线电影的| 精品国精品国产自在久国产应用| 精品国产一区二区在线| 青娱乐91视频| 免播放器亚洲| 亚洲一区二区日本| 日本一二三区在线视频| 中文字幕一区在线观看视频| 成人免费观看在线| 免费在线成人激情电影| 欧美一二区视频| 熟女俱乐部一区二区视频在线| 色狮一区二区三区四区视频| 久久久免费观看| 日本成人一级片| 成人sese在线| 在线精品日韩| 欧美aaaaa性bbbbb小妇| 欧美精品一卡二卡| 黄色国产在线观看| 中文字幕一区二区av | 欧美一区日韩一区| 丰满少妇一区二区三区| 欧美~级网站不卡| 国产精品27p| 天堂av资源在线| 亚洲免费av在线| 冲田杏梨av在线| 亚洲精品在线a| 视频直播国产精品| 亚洲成人第一网站| 成人黄色一级视频| 超碰97免费观看| 成人高清一区| 亚洲欧美日韩视频一区| 日本三级视频在线| 国产精品888| 亚洲综合激情五月| 国产成人福利夜色影视| 亚洲欧洲日本专区| 波多野结衣国产| 高清shemale亚洲人妖| 在线视频不卡一区二区三区| 精品3atv在线视频| 日韩精品欧美国产精品忘忧草| 久久久无码一区二区三区| 久久99精品久久久久久| 日韩av影视| 日韩电影免费观看高清完整版| 精品第一国产综合精品aⅴ| 三级在线观看免费大全| 久久国产成人午夜av影院| 台湾成人av| 日韩欧美精品电影| 亚洲无限av看| www.久久久久久久| 久久精品一区二区三区不卡| 日韩精品―中文字幕| 国产主播性色av福利精品一区| 九九热这里只有精品6| av一级黄色片| 亚洲精品国产视频| 永久看看免费大片| 欧美1区免费| 99久热re在线精品996热视频| 韩国av网站在线| 91麻豆精品91久久久久久清纯| 美女福利视频网| 久久99这里只有精品| 在线亚洲美日韩| 在线欧美激情| 欧美乱妇40p| 日韩中文字幕观看| 欧美日韩午夜剧场| 最近中文字幕在线mv视频在线| 日韩av在线免费观看不卡| 视频一区二区三区免费观看| 久久久久毛片| 欧美精品免费在线| 老牛影视av牛牛影视av| 懂色aⅴ精品一区二区三区蜜月 | 丰满人妻熟女aⅴ一区| 亚洲动漫第一页| 色无极影院亚洲| 精品中文字幕一区二区| 91免费版看片| 欧美人与动xxxxz0oz| 日本电影亚洲天堂| 日本电影在线观看网站| 欧美哺乳videos| 久久久精品福利| 国产精品第四页| 无码人妻精品一区二区三区99不卡| 一本一道久久综合狠狠老精东影业| 欧美日本国产精品| 欧美视频精品| 久久久免费精品视频| 国产天堂在线| 日韩精品一区二区三区三区免费| 欧美一级片免费在线观看| 国产欧美精品一区| wwwxxx色| 日韩电影一二三区| 精品视频在线观看一区二区| 网友自拍区视频精品| 国产欧美日韩视频| 国产三级电影在线播放| 中文字幕欧美精品日韩中文字幕| 国内精品久久久久久久久久| 色综合网色综合| 免费成年人视频在线观看| 91在线免费播放| 激情文学亚洲色图| 奶水喷射视频一区| 国产精品88久久久久久妇女| 亚洲深夜福利在线观看| 91香蕉视频在线下载| 巨茎人妖videos另类| 欧美精品一区二区免费| 国产日产精品久久久久久婷婷| 日韩欧美一级精品久久| japanese国产在线观看| 五月天一区二区三区| 国产视频精品免费| 久久久美女毛片| 插我舔内射18免费视频| 国产在线播放一区| www日韩视频| 国产亚洲一区在线| 青青在线视频免费观看| 99久久亚洲精品蜜臀| 欧美视频观看一区| 麻豆国产欧美一区二区三区r| 成人激情视频在线| 深夜视频一区二区| 91成人在线播放| 国产盗摄精品一区二区酒店| 久久精品免费电影| www.在线视频.com| 亚洲欧美国产va在线影院| 亚洲第一页视频| 欧美一区二区三级| 国产精品伦理一区| 欧美日韩精品欧美日韩精品 | 久久精品人成| 国产成人精品福利| 成人在线看片| 我要色综合中文字幕| 91亚洲国产成人精品性色| 国产精品久久久久久妇女| 国产成+人+综合+亚洲欧美丁香花| 黄频免费在线观看| 97国产suv精品一区二区62| 日本理论片午伦夜理片在线观看| 欧美成年人视频网站| 老司机精品视频在线观看6| 日韩在线观看精品| 色的视频在线免费看| 一本色道久久88综合亚洲精品ⅰ| 日韩资源在线| 亚洲欧美制服中文字幕| 男女污视频在线观看| 亚洲美女av在线| 你懂的在线免费观看| 亚洲人成电影网| 九色蝌蚪在线| 中文字幕一区二区三区电影| av网站无病毒在线| 日日狠狠久久偷偷四色综合免费 | 久久久伊人日本| segui88久久综合9999| 欧美一级淫片aaaaaaa视频| 蜜桃av在线播放| 国产成人拍精品视频午夜网站| 日韩成人亚洲| 91色p视频在线| 99这里只有精品视频| 久草精品电影| 精品免费av| 最新国产精品久久| 欧美伊人影院| 欧美日韩二三区| 久久天堂精品| 亚洲 国产 图片| 成人综合婷婷国产精品久久| 一级特级黄色片| 久久精品一区二区三区不卡| 精品国产大片大片大片| 洋洋av久久久久久久一区| 欧美三级韩国三级日本三斤在线观看| 日韩欧美在线视频| 国产精品欧美久久久久天天影视| 欧美不卡一二三| 国产裸舞福利在线视频合集| 久久天天躁狠狠躁夜夜av| а_天堂中文在线| 国产精品小说在线| 99re8这里有精品热视频免费| 久久精品日韩| 亚洲电影在线一区二区三区| 免费国产黄色网址| 美女视频黄 久久| 国产精品熟妇一区二区三区四区| 久久综合av免费| 神马午夜精品91| 日韩欧美在线免费| www.国产精品视频| 一区二区三区视频免费| 国产蜜臀在线| 国产精品一区二区三区久久| 国产一区在线电影| 国产精品美女在线播放| 欧美一级播放| 秘密基地免费观看完整版中文| 国产欧美日产一区| 国产午夜福利精品| 欧美日韩国产综合久久| 五月婷婷六月丁香综合| 久久久国产一区| 成人性生交大片免费观看网站| 96pao国产成视频永久免费| 亚洲97av| 91动漫在线看| 狠狠色伊人亚洲综合成人| 中文字幕丰满孑伦无码专区| 亚洲精品乱码久久久久久久久| 香蕉污视频在线观看| 精品国产伦理网| 麻豆影院在线观看| 欧洲成人免费aa| 欧美黄色录像| 99国产精品白浆在线观看免费| 美国三级日本三级久久99 | 亚洲天堂免费在线观看视频| 影音先锋在线国产| 亚洲精品av在线| 丁香花视频在线观看| 亚洲最大av在线| 97精品国产| 国产精品入口免费软件| 2021中文字幕一区亚洲| 日本在线视频免费观看| 精品精品国产高清a毛片牛牛 | 仙踪林久久久久久久999| 91视频免费版污| 久久亚洲精品国产精品紫薇 | 555www色欧美视频| 18视频免费网址在线观看| 国产国语刺激对白av不卡| 亚洲专区视频| 99蜜桃臀久久久欧美精品网站| 99久久精品免费看国产| 日韩精品成人一区| 亚洲高清不卡av| 日本不卡网站| 蜜桃999成人看片在线观看| 一本久久综合| 亚洲AV无码国产成人久久| 色综合久久九月婷婷色综合| 视频在线观看你懂的| 欧美亚洲国产视频小说| 亚洲肉体裸体xxxx137| 欧洲熟妇精品视频| 国产女人18毛片水真多成人如厕| 国产一级一级国产| 中文欧美在线视频| 成人国产在线| 中文字幕一区二区三区有限公司 | 欧美一区二区福利在线| av黄色在线| 丁香婷婷久久久综合精品国产| 午夜精彩国产免费不卡不顿大片| 绯色av蜜臀vs少妇| 亚洲国产精品综合小说图片区| 囯产精品一品二区三区| 91精品国产网站| 国产91精品对白在线播放| 久久久国产欧美| 中文字幕亚洲综合久久菠萝蜜| 92久久精品一区二区| 美女性感视频久久久| av日韩精品| 国产精品-区区久久久狼| 欧美国产日韩精品免费观看| 国产精品欧美激情在线| 国内精品美女av在线播放| 亚洲妇女av| 一级淫片在线观看| 偷拍日韩校园综合在线| 国产一级在线观看| 99国产在线视频| 国产美女一区| 日本不卡一二区| 亚洲国语精品自产拍在线观看| 欧美va视频| 蜜臀精品一区二区| 国产女人aaa级久久久级 | 国产精品69久久久| 91浏览器在线视频| 国产精品无码专区av免费播放| 国内免费久久久久久久久久久| 成人av动漫在线观看| 妖精视频在线观看| 欧美中文字幕一区| 欧美videosex性欧美黑吊| 欧美综合激情| 国产99精品国产| 中文字幕有码视频| 国产做受高潮69| 99久久久久国产精品| 成人免费av片| 精品日韩一区二区三区| 亚洲电影有码| 国产精品333| 亚洲综合一二三区| 91激情在线|