日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式之创建型——工厂模式(3种)

發(fā)布時(shí)間:2023/12/20 asp.net 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之创建型——工厂模式(3种) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

→23種設(shè)計(jì)模式大綱

三種工廠模式

  • →23種設(shè)計(jì)模式大綱
  • 定義
  • 分類(lèi)
      • 1)簡(jiǎn)單工廠
        • UML類(lèi)圖
      • 2)工廠方法
        • UML類(lèi)圖
      • 3)抽象工廠
        • UML類(lèi)圖
  • 總結(jié)

定義

將創(chuàng)建對(duì)象這一復(fù)雜的過(guò)程交由工廠控制,通過(guò)工廠來(lái)統(tǒng)一獲取對(duì)象。

分類(lèi)

1)簡(jiǎn)單工廠

簡(jiǎn)單工廠(靜態(tài)工廠)并不屬于GOF中23種設(shè)計(jì)模式之一,但在實(shí)際開(kāi)發(fā)中也用的相對(duì)較多。

UML類(lèi)圖


根據(jù)UML類(lèi)圖可以看出,工廠模塊根據(jù)用戶傳入的參數(shù)來(lái)實(shí)例化對(duì)應(yīng)的產(chǎn)品,產(chǎn)品具有抽象的接口。

抽象產(chǎn)品接口和產(chǎn)品類(lèi)

public interface Product {void function(); }class ProductA implements Product {@Overridepublic void function() {System.out.println("調(diào)用 A 產(chǎn)品的功能");} } class ProductB implements Product {@Overridepublic void function() {System.out.println("調(diào)用 B 產(chǎn)品的功能");} }

工廠類(lèi)

public class SimpleFactory {public static Product createProduct(String productName){if(productName.equals("A")){return new ProductA();}if(productName.equals("B")){return new ProductB();}throw new RuntimeException("無(wú)相關(guān)產(chǎn)品");} }

調(diào)用測(cè)試

public class Client {public static void main(String[] args) {Product a = SimpleFactory.createProduct("A");Product b = SimpleFactory.createProduct("B");a.function();b.function();} }

總結(jié)

  • 調(diào)用方不用關(guān)心產(chǎn)品內(nèi)部如何構(gòu)建,只需要調(diào)用工廠提供的方法,傳入對(duì)應(yīng)產(chǎn)品名即可獲取對(duì)象
  • 傳參時(shí)可以使用枚舉的方式來(lái)匹配

問(wèn)題

  • 新增產(chǎn)品時(shí),需要在工廠內(nèi)增加 IF 邏輯,不符合開(kāi)閉原則
  • 產(chǎn)品創(chuàng)建時(shí)全放在一個(gè)工廠內(nèi),該工廠承擔(dān)職責(zé)過(guò)重,一旦出錯(cuò),所有的產(chǎn)品都會(huì)受到影響

2)工廠方法

UML類(lèi)圖

  • 比起簡(jiǎn)單工廠,工廠方法進(jìn)一步抽象了 “工廠” 這一角色。
  • 具體實(shí)例化的工廠都實(shí)現(xiàn)抽象工廠接口。
  • 一個(gè)實(shí)例化工廠負(fù)責(zé)創(chuàng)建一個(gè)產(chǎn)品,一一對(duì)應(yīng)。

產(chǎn)品類(lèi)

public interface Product {void function(); }class ProductA implements Product {@Overridepublic void function() {System.out.println("調(diào)用 A 產(chǎn)品的功能");} }class ProductB implements Product {@Overridepublic void function() {System.out.println("調(diào)用 B 產(chǎn)品的功能");} }

工廠類(lèi)

public interface AbstractFactory {public Product createProduct(); } //工廠A負(fù)責(zé)創(chuàng)建產(chǎn)品A class FactoryA implements AbstractFactory{@Overridepublic Product createProduct() {return new ProductA();} } //工廠B負(fù)責(zé)創(chuàng)建產(chǎn)品B class FactoryB implements AbstractFactory{@Overridepublic Product createProduct() {return new ProductB();} }

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

新增產(chǎn)品后,不需要像簡(jiǎn)單工廠一樣再重新修改原因邏輯。新增一個(gè)新的工廠專(zhuān)門(mén)去負(fù)責(zé)創(chuàng)建新的產(chǎn)品即可。

缺點(diǎn):

如果產(chǎn)品數(shù)量過(guò)多,那么就會(huì)產(chǎn)生很多的工廠類(lèi),工廠類(lèi)太多自然也是個(gè)問(wèn)題。

3)抽象工廠

新概念→產(chǎn)品族:將各種相關(guān)的產(chǎn)品組合在一起的集合。

為了解決工廠類(lèi)太多的問(wèn)題,我們可以讓一個(gè)工廠去生產(chǎn)對(duì)應(yīng)的產(chǎn)品族。
從 1對(duì)1(工廠方法),變?yōu)?對(duì)N(抽象工廠)。

舉個(gè)例子:

  • 蘋(píng)果手機(jī),蘋(píng)果筆記本,蘋(píng)果臺(tái)式電腦是一個(gè)產(chǎn)品族。蘋(píng)果廠商負(fù)責(zé)生產(chǎn)這個(gè)產(chǎn)品族。
  • 小米手機(jī),小米筆記本,小米臺(tái)式電腦是一個(gè)產(chǎn)品族。小米廠商負(fù)責(zé)生產(chǎn)這個(gè)產(chǎn)品族。

UML類(lèi)圖


工廠

public interface AbstractFactory {Pen createPen();Book createBook();Bag createBag(); }class FactoryA implements AbstractFactory{@Overridepublic Pen createPen() {return new Apen();}@Overridepublic Book createBook() {return new Abook();}@Overridepublic Bag createBag() {return new Abag();} }class FactoryB implements AbstractFactory{@Overridepublic Pen createPen() {return new Bpen();}@Overridepublic Book createBook() {return new Bbook();}@Overridepublic Bag createBag() {return new Bbag();} }

產(chǎn)品

public interface Pen {void function(); } interface Book {void function(); } interface Bag {void function(); } class Apen implements Pen {@Overridepublic void function() {System.out.println(" A 廠 Pen");} } class Abook implements Book {@Overridepublic void function() {System.out.println(" A 廠 Book");} } class Abag implements Bag {@Overridepublic void function() {System.out.println(" A 廠 Bag");} } class Bpen implements Pen {@Overridepublic void function() {System.out.println(" B 廠 Pen");} } class Bbook implements Book {@Overridepublic void function() {System.out.println(" B 廠 Book");} } class Bbag implements Bag {@Overridepublic void function() {System.out.println(" B 廠 Bag");} }

引入產(chǎn)品族的概念確實(shí)一定程度上的解決了工廠類(lèi)的問(wèn)題。

對(duì)于產(chǎn)品族而言,如果再增加又有新的廠商加入,那么再增加一個(gè)工廠即可。

注意點(diǎn):

  • 對(duì)于產(chǎn)品族的橫向擴(kuò)展,抽象工廠遵守了 “開(kāi)閉原則”。(增加新的工廠)
  • 但對(duì)于產(chǎn)品族的縱向擴(kuò)展,即如果產(chǎn)品族內(nèi)需要新增一種產(chǎn)品,則會(huì)面臨大幅度的修改。

所以抽象工廠使用時(shí),需要能夠盡量全面的預(yù)估一個(gè)產(chǎn)品族需要包含的產(chǎn)品。

總結(jié)

  • 簡(jiǎn)單工廠:抽離創(chuàng)建對(duì)象這一過(guò)程,調(diào)用方統(tǒng)一獲取對(duì)象;
  • 工廠方法:引入抽象工廠概念,1 個(gè)產(chǎn)品對(duì)應(yīng) 1 個(gè)工廠;
  • 抽象工廠:引入產(chǎn)品族概念,1 個(gè)產(chǎn)品族對(duì)應(yīng) 1 個(gè)工廠,N 個(gè)產(chǎn)品對(duì)應(yīng) 1 個(gè)工廠;
  • 總結(jié)

    以上是生活随笔為你收集整理的设计模式之创建型——工厂模式(3种)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。