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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

工程模式和抽象工厂模式_功能工厂模式

發(fā)布時(shí)間:2023/12/3 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工程模式和抽象工厂模式_功能工厂模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工程模式和抽象工廠模式

您是否需要一種非常快速的方法來制作Factory對(duì)象? 然后,您需要lambda或其他函數(shù)傳遞! 它不僅快速,而且非常簡(jiǎn)單。 我敢打賭,如果您對(duì)Lambdas相當(dāng)滿意,那么您只需閱讀標(biāo)題就可以做到這一點(diǎn)。 如果您是其中之一,請(qǐng)堅(jiān)持; 你永遠(yuǎn)不知道你能學(xué)到什么。

附帶說明:我正在用Java和Python做代碼示例。 為什么? 因?yàn)槲蚁矚g這兩種語(yǔ)言,所以為這兩種語(yǔ)言放東西肯定不會(huì)受到傷害。

工廠模式入門

如果您已經(jīng)知道什么是工廠設(shè)計(jì)模式,則可以跳到下一部分。

Factory模式的重點(diǎn)是為對(duì)象和方法提供一種實(shí)例化對(duì)象的方法,而無需暴露所有(或通常是任何一種 )實(shí)例化邏輯(需要將什么傳遞到構(gòu)造函數(shù)中)。

舉一個(gè)愚蠢的例子,假設(shè)有一類“ Scientist ,它需要一種方法來產(chǎn)生新的Pen來寫下實(shí)驗(yàn)數(shù)據(jù),但是他不想被創(chuàng)建過程所困擾。 為此,您將為Scientist一個(gè)PenFactory , Scientist只需知道按一下工廠的按鈕即可獲得新的筆。

PenFactory是一個(gè)簡(jiǎn)單的對(duì)象,只有一個(gè)create()方法,該方法在您每次調(diào)用Pen時(shí)都會(huì)提供一個(gè)新的Pen實(shí)例。 如果Scientist關(guān)心Pen顏色,則可以為他提供ColoredPenFactory , ColoredPenFactory的create()方法也接受顏色參數(shù)。 然后, ColoredPenFactory必須弄清楚如何為該筆提供這種顏色。

擴(kuò)展工廠模式理念

Factory Pattern是面向?qū)ο蟠a的一種模式,因此僅限于OO的工作方式,但是我們可以利用其目的并嘗試找到一種以功能方式使其實(shí)現(xiàn)的方法,這實(shí)際上使它成為了很多更輕松。

實(shí)際上,由于缺乏傳遞功能的能力而創(chuàng)建了許多OO設(shè)計(jì)模式。 這些中的大多數(shù)都可以簡(jiǎn)單地通過傳遞函數(shù)來替換。 其中的簡(jiǎn)短列表包括命令,工廠和策略。 如果其他許多人接受函數(shù),則可以刪除許多類層次結(jié)構(gòu)。 其中一些包括模板和訪客。

因此,最大的區(qū)別是工廠類不必是一個(gè)類。 它也可以是簡(jiǎn)單的“可調(diào)用”。 因此,讓我們深入研究一些示例。

OO筆廠

這樣您就可以看到經(jīng)典的OO模式和新的功能模式之間的區(qū)別,這里是OO Java中的示例類和接口。

public interface Pen {void write(String toWrite);boolean outOfInk(); }public interface PenFactory {Pen create(); }public class Scientist {private PenFactory penerator;private Pen pen;public Scientist(PenFactory penerator) {this.penerator = penerator;this.pen = penerator.create();}public void writeData(String data) {if(pen.outOfInk()) {pen = penerator.create();}pen.write(data);} }

在OO Python中

class Pen(metaclass=ABCMeta):def write(self, text):passdef out_of_ink(self):passclass PenFactory(metaclass=ABCMeta):def create(self):passclass Scientist():def __init__(self, pen_factory):self.penerator = pen_factoryself.pen = self.penerator.create()def write_data(self, data):if self.pen.out_of_ink():pen = self.penerator.create()pen.write(data)

您是否了解我如何稱呼PenFactory實(shí)例penerator ? 我認(rèn)為這有點(diǎn)愚蠢。 希望您也喜歡。 如果沒有,哦。

轉(zhuǎn)換為簡(jiǎn)單的功能模式

當(dāng)涉及到Java版本時(shí),由于PenFactory視為功能接口,因此實(shí)際上不需要進(jìn)行任何更改,但是由于您可以用Supplier<Pen>替換PenFactory任何實(shí)例, PenFactory不需要它。 因此, Scientist類看起來像這樣:

public class Scientist {private Supplier penerator;private Pen pen;public Scientist(Supplier penerator) {this.penerator = penerator;this.pen = penerator.get();}public void writeData(String data) {if(pen.outOfInk()) {pen = penerator.get();}pen.write(data);} }

在Python中,您可以完全刪除PenFactory而只需使用返回Pen任何可調(diào)用對(duì)象即可。 您還必須在“ Scientist中更改調(diào)用工廠的create()方法的行,并僅用括號(hào)將其替換即可。

class Scientist():def __init__(self, pen_factory):self.penerator = pen_factoryself.pen = self.penerator()def write_report(self, data):if self.pen.out_of_ink():self.pen = self.penerator()self.pen.write(data)

因此,要?jiǎng)?chuàng)建帶有提供MyPenClass實(shí)例的lambda的Scientist實(shí)例,請(qǐng)?jiān)贘ava中鍵入以下內(nèi)容:

Scientist albert = new Scientist(() -> new MyPenClass());

或在Python中:

albert = Scientist(lambda: MyPenClass()) # or skip the lambda by passing the "constructor" thomas = Scientist(MyPenClass)

具有依賴關(guān)系的類的工廠

假設(shè)我想為一個(gè)類的工廠制造工廠,該類的構(gòu)造函數(shù)需要一個(gè)筆品牌的名稱。 我們將此類BrandPen 。 我們將如何為之建立工廠? 好吧,寫lambda并沒有什么不同,真的。 但是,我們?nèi)绾慰创渌x傳入的可調(diào)用對(duì)象的方式呢?

在Java中,您可以將lambda的實(shí)例保存在變量中并傳遞給它。或者您可以使用方法引用:

Supplier bicPen = () -> new BrandPen("BiC"); Scientist thomas = new Scientist(bicPen); // assuming that BrandPen has a static method called bicPen Scientist nicola = new Scientist(BrandPen::bicPen);

在Python中,您可以定義一個(gè)執(zhí)行該功能的函數(shù)或分配一個(gè)partial函數(shù)來執(zhí)行此操作:

def bic_pen():return BrandPen("BiC") # or bic_pen = partial(BrandPen, "BiC")nicola = Scientist(bic_pen)

有依存關(guān)系的工廠

哦,天哪, Scientist現(xiàn)在希望能夠指定工廠提供的筆的顏色 ! 好吧,您可以為他提供每種顏色的不同工廠,并告訴他使用每個(gè)不同的工廠來制造不同的筆,但是在他的實(shí)驗(yàn)室中根本沒有足夠的空間容納這么多PenFactory ! 我們必須給工廠提供可以使用哪種顏色的信息。

為此,我們必須將Java的Supplier<Pen>更改為Function<>Color, Pen> 。 顯然,您無需在Python中更改類型,因?yàn)樗莿?dòng)態(tài)的并且不需要類型信息。

但是, Scientist班也需要改變他們使用工廠的方式。 在Java中,無論Scientist在哪里請(qǐng)求新實(shí)例,都需要提供顏色,如下所示:

pen = penerator.apply(Color.RED);

或者像這樣,在Python中:

self.pen = self.penerator(Color.RED)

我們傳遞給Java Scientist的工廠看起來像這樣:

Scientist erwin = new Scientist(color -> new ColoredPen(color, "BiC"));

我們?cè)赑ython中提供的代碼如下所示:

def colored_bic_pen(color):return ColoredPen(color, "BiC")erwin = Scientist(colored_bic_pen)

多方法工廠

在Internet上“工廠模式”的一些示例中,它們顯示了具有多種方法來調(diào)用生成對(duì)象的工廠。 我還沒有在現(xiàn)實(shí)生活中看到這種效果,但是可能會(huì)發(fā)生。 在這些情況下,最好堅(jiān)持使用OO選項(xiàng),但是如果要將其更改為功能模式,只需提供單獨(dú)的工廠可調(diào)用對(duì)象,而不是使用多個(gè)方法的一個(gè)對(duì)象即可。

奧托羅

我沒想到會(huì)寫那么多,但是隨著我的前進(jìn),我想展示太多的小差異。 我沒有了解所有內(nèi)容,主要是因?yàn)槲也幌敫櫵袃?nèi)容,尤其是兩種語(yǔ)言,但是我敢肯定,我給了您足夠的工具箱,可以在您的計(jì)算機(jī)上弄清楚它們擁有。

我希望你學(xué)到了一些東西。 如果沒有,我希望您至少喜歡這個(gè)例子。

翻譯自: https://www.javacodegeeks.com/2015/02/functional-factory-pattern.html

工程模式和抽象工廠模式

總結(jié)

以上是生活随笔為你收集整理的工程模式和抽象工厂模式_功能工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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