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