-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
工廠模式分為哪三種類型(工廠模式分為哪三種類型圖片)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于工廠模式分為哪三種類型的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、MVC包命名
工廠類你可以新建個(gè)factory文件夾或直接放在項(xiàng)目根目錄下
i18n的propertiies文件直接放在項(xiàng)目根目錄下
工廠模式都屬于創(chuàng)建(對(duì)象)型模式
工廠模式分為三類:
1)簡(jiǎn)單工廠模式(Simple Factory)
2)工廠方法模式(Factory Method)
3)抽象工廠模式(Abstract Factory)
一一看來(lái):
1)簡(jiǎn)單工廠模式(Simple Factory)
又稱 靜態(tài)工廠方法模式(因?yàn)樗庆o態(tài)方法聲明的)通過(guò)一個(gè)生產(chǎn)車(chē)的廠 來(lái)說(shuō)明。
e.g:
package com.factory;
interface Cars {
public void car();
}
class BenChi implements Cars {
public void car() {
System.out.println("生產(chǎn)奔馳車(chē)");
}
}
class FuTe implements Cars {
public void car() {
System.out.println("生產(chǎn)福特車(chē)");
}
}
//注意:工廠里的那個(gè)方法是靜態(tài)的,使用了類反射來(lái)動(dòng)態(tài)創(chuàng)建對(duì)象。
class
CarsFactory {
public static Cars getInstance(String type) {
Cars c =
null;
try {
c = (Cars) Class.forName("com.factory." +
type).newInstance();
} catch (Exception e) {
c = null;
}
return c;
}
}
public class Car {
public static void main(String[] args) {
Cars c =
CarsFactory.getInstance("BenChi");
if (c != null) {
c.car();
} else {
System.out.println("我們這不生產(chǎn)你要求類型的車(chē)");
}
}
}
簡(jiǎn)單工廠的優(yōu)點(diǎn)在于他的工廠類負(fù)責(zé)所有對(duì)象的創(chuàng)建,通過(guò)工廠類,外界可以從直
接創(chuàng)建具體產(chǎn)品的尷尬局面中脫離出來(lái) ,只關(guān)注使用對(duì)象就可以了 ,而不必管對(duì)
象是怎么創(chuàng)建的 。
工廠類負(fù)責(zé)類的創(chuàng)建 ,缺點(diǎn)也產(chǎn)生了,造成工廠類需要復(fù)雜的業(yè)務(wù)邏輯。
該怎么解決這一點(diǎn),工廠方法模式出現(xiàn)了。
2)工廠方法模式(Factory Method)
工廠方法模式又稱工廠模式,也叫虛擬構(gòu)造器模式或者多臺(tái)工廠(Polymorphic Factory)模式.
簡(jiǎn)單工廠 核心是個(gè)
具體工廠類!
而工廠方法模式的核心 是個(gè)抽象工廠類!具體實(shí)現(xiàn)交給他的子類實(shí)現(xiàn)。
用意:定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際的創(chuàng)建工作推遲到子類中(利用多態(tài))
工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
e.g:
package com.factory.method;
// 產(chǎn)品 Fruit接口
interface Fruit {
public void getFruit();
}
// 具體產(chǎn)品Apple,Orange
class Apple implements Fruit {
public Apple()
{
System.out.println("種植蘋(píng)果");
}
public void getFruit() {
System.out.println("收獲蘋(píng)果");
}
}
//
抽象工廠方法
interface FruitAbstractFactory {
public Fruit
createFruit();
}
// 具體工廠方法
class AppleFactory implements FruitAbstractFactory {
public
Fruit createFruit() {
return new Apple();
}
}
public class Text
{
public static void main(String[] args) {
FruitAbstractFactory
appleFactory = new AppleFactory();
Fruit apple = (Apple)
appleFactory.createFruit();
apple.getFruit();
// FruitAbstractFactory
orangeFactory = new OrangeFactory();
// Fruit orange =
orangeFactory.createFruit();
//
orange.getFruit();
}
}
//如果廠家再想種植桔子的話,只需再寫(xiě)工廠和產(chǎn)品無(wú)需修改以前的代碼!
class
OrangeFactory implements FruitAbstractFactory {
public Fruit createFruit()
{
return new Orange();
}
}
class Orange implements Fruit {
public Orange() {
System.out.println("種植桔子");
}
public void getFruit() {
System.out.println("收獲桔子");
}
}
優(yōu)勢(shì)和缺陷
在工廠模式中,工廠方法用來(lái)創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié).工廠方法模式的核心是一個(gè)抽象工廠類,各種具體工廠類通過(guò)抽象工廠類將工廠方法繼承下來(lái).如此使得客戶可以只關(guān)心抽象產(chǎn)品和抽象工廠,完全不用理會(huì)返回的是哪一種具體產(chǎn)品,也不關(guān)心它是如何被具體工廠創(chuàng)建的.
1.基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵.它能夠使工廠可以自主確定創(chuàng)建和中產(chǎn)品對(duì)象,而如何穿件這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部.工廠方法模式之所以又被稱為多態(tài)工廠模式,就正是因?yàn)樗械木唧w工廠類都具有同一抽象父類.
2.使用工廠方法模式的另外一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新的產(chǎn)品時(shí),無(wú)需修改抽象工廠和抽象產(chǎn)品提供的接口,無(wú)需修改客戶端,也無(wú)需修改其他的具體工廠和具體產(chǎn)品,
而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了,這樣,系統(tǒng)的可擴(kuò)展性非常好.優(yōu)秀的面向?qū)ο笤O(shè)計(jì)鼓勵(lì)使用封存(Encapsulation)和委托(Delegation)來(lái)構(gòu)造軟件系統(tǒng),工廠方法模式正是使用了封裝和委托的典型例子,其中封裝是通過(guò)抽象工廠來(lái)體現(xiàn)的,而委托則是通過(guò)抽象工廠將創(chuàng)建對(duì)象的責(zé)任完全交給具體工廠來(lái)體現(xiàn)的.
3.使用抽象工廠方法模式的缺點(diǎn)是在添加新產(chǎn)品時(shí),需要重新寫(xiě)一個(gè)具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類,當(dāng)兩者都比較簡(jiǎn)單時(shí),系統(tǒng)會(huì)有相對(duì)額外的開(kāi)銷(xiāo).
應(yīng)用情景:
類不知道自己要?jiǎng)?chuàng)建哪一個(gè)對(duì)象.
類用它的子類來(lái)指定創(chuàng)建哪個(gè)對(duì)象.
客戶需要清楚創(chuàng)建了哪一個(gè)對(duì)象.
3)抽象工廠模式(Abstract Factory)
先來(lái)看一下他個(gè)工廠方法的區(qū)別:
工廠方法模式:一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。
抽象工廠模式:多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。
區(qū)別:工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。
工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。
Thinking in this way:
Abstract Factory is a factory making a family of
ABSTRACT products.
Factory Method is a factory implemented as a METHOD. The
key of this pattern is letting subclasses override the method.
簡(jiǎn)單點(diǎn):
抽象工廠生產(chǎn)的是一套產(chǎn)品。結(jié)合個(gè)例子是否就明白了 ?
例如生產(chǎn)電腦:
生產(chǎn)的 鍵盤(pán) 鼠標(biāo) 主板 是一套產(chǎn)品 共同組成了電腦。
package com.factory.abstracttrue;
interface AbstractFactory {
public void createMouse();
public void createKeyKoard();
public void createMainPane();
}
class ComputerFactory implements AbstractFactory {
KeyBoard keyBoard =
null;
MainPane mainPane = null;
Mouse mouse = null;
public void createKeyKoard() {
System.out.println("制造了諾頓牌鍵盤(pán)");
keyBoard = new KeyBoard();
}
public void createMainPane() {
System.out.println("制造了力穩(wěn)牌主板");
mainPane = new MainPane();
}
public void createMouse() {
System.out.println("制造了飛燕牌鼠標(biāo)");
mouse
= new Mouse();
}
public void show() {
keyBoard.keyKoard();
mainPane.mainPane();
mouse.mouse();
}
}
interface AbstractMouse {
public void mouse();
}
interface AbstractKeyBoard {
public void keyKoard();
}
interface AbstractMainPane {
public void mainPane();
}
class Mouse implements AbstractMouse {
public void mouse() {
System.out.println("鼠標(biāo)性能靈活");
}
}
class KeyBoard implements AbstractKeyBoard {
public void keyKoard() {
System.out.println("鍵盤(pán)功能豐富");
}
}
class MainPane implements AbstractMainPane {
public void mainPane() {
System.out.println("主板性能穩(wěn)定");
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory computerFactory = new ComputerFactory();
computerFactory.createKeyKoard();
computerFactory.createMainPane();
computerFactory.createMouse();
((ComputerFactory)
computerFactory).show();
}
}
總結(jié):
對(duì)于系統(tǒng)中兩個(gè)實(shí)例a和b,他們的關(guān)系 要么a使用b,要么a創(chuàng)建b,但兩種關(guān)系一
定不要同時(shí)存在。【這大概是工廠模式出現(xiàn)的目的吧,(及創(chuàng)建型模式)】
簡(jiǎn)單工廠:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品。(對(duì)于增加新的產(chǎn)品,無(wú)能為力)
工廠模式:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品。(支持增加新產(chǎn)品)
抽象工廠:用來(lái)生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。(對(duì)于增加新的產(chǎn)品,無(wú)能為力;支持增加產(chǎn)品族)
二、什么是Java的工廠模式?
factory模式不需要建立什么包,完全得靠你對(duì)factory模式的理解,工廠模式基本上應(yīng)該是體現(xiàn)了一個(gè)多態(tài)的概念,用戶只關(guān)心結(jié)果,而不需要關(guān)心其具體過(guò)程...
工廠模式有三個(gè)參與者,抽象產(chǎn)品(Product)、工廠(Creator)和具體產(chǎn)品(ConcreteProduct)。客戶只會(huì)看到工廠和抽象產(chǎn)品。
public interface Product{
public String getName();
}
public class ConcreteProduct implements Product{
public String getName(){
return "產(chǎn)品1";
}
}
public class Creator{
public static Product create1(){
return new ConcreteProduct();
}
}
工廠模式的作用在于將創(chuàng)建具體產(chǎn)品的方法由工廠類控制,客戶只需要知道產(chǎn)品的抽象類型
三、工廠模式,簡(jiǎn)單工廠模式,抽象工廠模式 三者有什么區(qū)別
工廠模式的好處就在于將工廠和產(chǎn)品之間的耦合降低,將具體產(chǎn)品的構(gòu)造過(guò)程放在了具體工廠類里面。在以后擴(kuò)展產(chǎn)品的時(shí)候方便很多,只需要添加一個(gè)工廠類,一個(gè)產(chǎn)品類,就能方便的添加產(chǎn)品,而不需要修改原有的代碼。而在簡(jiǎn)單工廠中,如果要增加一個(gè)產(chǎn)品,則需要修改工廠類,增加if/else分支,或者增加一個(gè)case分支,工廠模式符合軟件開(kāi)發(fā)中的OCP原則(open close principle),對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
抽象工廠模式:這個(gè)模式我總是感覺(jué)和builder模式非常相似。
工廠方法模式提供的是對(duì)一個(gè)產(chǎn)品的等級(jí)模式,,而抽象工廠方法提供的是對(duì)多個(gè)產(chǎn)品的等級(jí)模式,注意,這里的多個(gè)具體產(chǎn)品之間是相互耦合的,也就是說(shuō)這里的抽象工廠提供的產(chǎn)品之間是存在某種聯(lián)系的。
有人做如下的比較:
工廠方法模式:一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。
抽象工廠模式:多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。
區(qū)別:工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。
工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。
下面是一個(gè)形象的比喻:
無(wú)論是簡(jiǎn)單工廠模式、工廠模式還是抽象工廠模式,它們本質(zhì)上都是將不變的部分提取出來(lái),將可變的部分留作接口,以達(dá)到最大程度上的復(fù)用。拿一個(gè)生產(chǎn)水杯(cup)的工廠舉例:起初,不用工廠模式,我必須在生產(chǎn)水杯之前知道水杯的材料和形狀等水杯的所有特征才能生產(chǎn),這就是我們的new Cup();這個(gè)Cup必須是具體的。廠主發(fā)現(xiàn)同一形狀的被子,只是材料不同,如一個(gè)是玻璃(glass)的,一個(gè)是瓷(china)的,但是確要兩條生產(chǎn)線,顯然有資源浪費(fèi)的嫌疑?,F(xiàn)在廠主生產(chǎn)杯子時(shí)先不讓生產(chǎn)線知道我要產(chǎn)的是玻璃的還是瓷的,而是讓它在不知道具體材料的情況下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形狀的具體杯子了。但是很可惜,java并不能new一個(gè)抽象的Cup,所以就有了簡(jiǎn)單工廠模式。原來(lái)是Cup cup=new Cup;現(xiàn)在是SimpleCupFactory.createCup(String cupName),根據(jù)cup的名字生產(chǎn)Cup,而createCup返回的是一個(gè)實(shí)現(xiàn)了 Cup接口或抽象類的具體Cup。簡(jiǎn)單抽象工廠模式有一個(gè)問(wèn)題,就是當(dāng)我現(xiàn)在想生產(chǎn)一個(gè)同樣形狀的鐵杯時(shí),工廠里并沒(méi)有定義相應(yīng)的處理流程,只能更改createCup方法,這就不合理了。我現(xiàn)在只是想生產(chǎn)鐵杯,你只要在最后的時(shí)候把玻璃原料換成鐵的不就行了嗎,干嘛還要更改整條生產(chǎn)線呢?于是就有了工廠模式。原來(lái)生產(chǎn)線在生產(chǎn)模具的時(shí)候還要考慮是為玻璃杯生產(chǎn)的模具還是為鐵杯生產(chǎn)的模具,現(xiàn)在它不用管了。CupFactory.createCup()創(chuàng)建Cup.CupFactory是接口或抽象類。實(shí)現(xiàn)它的具體子類會(huì)創(chuàng)建符合Cup接口的具體Cup。那么現(xiàn)在廠主想要生產(chǎn)水壺(kettle),用工廠模式就不得不再造一條水壺生產(chǎn)線,能不能在水杯生產(chǎn)線同時(shí)生產(chǎn)水壺呢?這就是抽象工廠模式。
四、誰(shuí)能幫簡(jiǎn)單介紹一下工廠模式呢?
你好,很高興能解答你的問(wèn)題。
首先工廠模式是軟件開(kāi)發(fā)中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。
工廠模式主要的意圖是:定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)行。
案列1:您需要一輛汽車(chē),可以直接從工廠里面提貨,而不用去管這輛汽車(chē)是怎么做出來(lái)的,以及這個(gè)汽車(chē)?yán)锩娴木唧w實(shí)現(xiàn)。 2、Hibernate 換數(shù)據(jù)庫(kù)只需換方言和驅(qū)動(dòng)就可以。
優(yōu)點(diǎn): 1、一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道其名稱就可以了。 2、擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只要擴(kuò)展一個(gè)工廠類就可以。 3、屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。
缺點(diǎn):每次增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠,使得系統(tǒng)中類的個(gè)數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類的依賴。這并不是什么好事。
案例2:日志記錄器:記錄可能記錄到本地硬盤(pán)、系統(tǒng)事件、遠(yuǎn)程服務(wù)器等,用戶可以選擇記錄日志到什么地方。 2、數(shù)據(jù)庫(kù)訪問(wèn),當(dāng)用戶不知道最后系統(tǒng)采用哪一類數(shù)據(jù)庫(kù),以及數(shù)據(jù)庫(kù)可能有變化時(shí)。 3、設(shè)計(jì)一個(gè)連接服務(wù)器的框架,需要三個(gè)協(xié)議,"POP3"、"IMAP"、"HTTP",可以把這三個(gè)作為產(chǎn)品類,共同實(shí)現(xiàn)一個(gè)接口。
注意事項(xiàng):作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠模式,而簡(jiǎn)單對(duì)象,特別是只需要通過(guò) new 就可以完成創(chuàng)建的對(duì)象,無(wú)需使用工廠模式。如果使用工廠模式,就需要引入一個(gè)工廠類,會(huì)增加系統(tǒng)的復(fù)雜度。
希望能幫到你,謝謝!
以上就是關(guān)于工廠模式分為哪三種類型相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
貴州工廠景觀設(shè)計(jì)圖集(貴州工廠景觀設(shè)計(jì)圖集有哪些)
杭州下沙有多少個(gè)工廠(杭州下沙有多少個(gè)工廠招工)
手機(jī)圖標(biāo)怎么換成自定義圖片(OPPO手機(jī)圖標(biāo)怎么換成自定義圖片)
工商銀行商戶收款碼app(工商銀行商戶收款碼收款有手續(xù)費(fèi)嗎)