摘要:缺點(diǎn)工廠類的職責(zé)相對(duì)過重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,違背開閉原則。就像現(xiàn)在的,它知道要使用接口,但是不知道由誰實(shí)現(xiàn),也不知道如何實(shí)現(xiàn),從而得不到接口對(duì)象,就無法使用接口,那該怎么辦于是乎簡單工廠就來了。
簡單工廠
定義:由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例
類型:創(chuàng)建性,但不屬于GOF23種設(shè)計(jì)模式
適用場景
工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少
客戶端(應(yīng)用層)只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心
優(yōu)點(diǎn):只需要傳入一個(gè)正確的參數(shù),就可以獲取你所需要的對(duì)象而無需知道其創(chuàng)建細(xì)節(jié)。
缺點(diǎn):工廠類的職責(zé)相對(duì)過重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,違背開閉原則。
案例public abstract class Video { public abstract void produce(); }
public class JavaVideo extends Video { @Override public void produce() { System.out.println("錄制Java課程視頻"); } }
public class PythonVideo extends Video { @Override public void produce() { System.out.println("錄制Python課程視頻"); } }
public class Test { public static void main(String[] args) { Video video = new PythonVideo(); video.produce(); } }
思考
Video video = new PythonVideo();這行在客戶端的代碼使得客戶端不但知道了Video抽象類還知道了其實(shí)現(xiàn)類PythonVideo。接口的思想是“封裝隔離”,而實(shí)現(xiàn)類PythonVideo應(yīng)該是被抽象類Video封裝并同客戶端隔離開的,即客戶端根本就應(yīng)該不知道具體的實(shí)現(xiàn)類是PythonVideo。
于是乎我們就拿走new PythonVideo( );但是我們卻無法得到Video對(duì)象。就像現(xiàn)在的Client,它知道要使用Video接口,但是不知道由誰實(shí)現(xiàn),也不知道如何實(shí)現(xiàn),從而得不到接口對(duì)象,就無法使用接口,那該怎么辦?于是乎簡單工廠就來了。
public class VideoFactory { //【1】反射 public Video getVideo(Class c){ Video video = null; try { video = (Video) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return video; } public Video getVideo(String type){ if("java".equalsIgnoreCase(type)){ return new JavaVideo(); }else if("python".equalsIgnoreCase(type)){ return new PythonVideo(); } return null; } }
public class Test { public static void main(String[] args) { VideoFactory videoFactory = new VideoFactory(); Video video = videoFactory.getVideo("java"); if(video == null){ return; } video.produce(); /* VideoFactory videoFactory = new VideoFactory(); Video video = videoFactory.getVideo(JavaVideo.class); if(video == null){ return; } video.produce();*/ } }
問題:
如果需要增加其他類型的視頻,就需要在VideoFactory中修改添加相應(yīng)的代碼,這個(gè)時(shí)候可以使用工廠方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74967.html
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態(tài)工廠方法...
摘要:簡單工廠,工廠模式和抽象工廠。不要認(rèn)為簡單工廠是用就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。 工廠模式,實(shí)際上也會(huì)根據(jù)業(yè)務(wù)情景不同會(huì)有不同的實(shí)現(xiàn)方式。一般分為3種。簡單工廠,工廠模式和抽象工廠。顧名思義,這三種從簡單到抽象,名稱越來越高大上,實(shí)現(xiàn)方式肯定是越來越復(fù)雜 結(jié)論1:三種工廠的實(shí)現(xiàn)越來越復(fù)雜 簡單工廠 public class Factory { // 定義...
摘要:需要說明的是在設(shè)計(jì)模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式,將簡單工廠模式看為工廠方法模式的一種特例,兩者歸為一類。工廠模式的作用工廠模式的作用封裝變化創(chuàng)建邏輯有可能變化,封裝成工廠類之后,創(chuàng)建邏輯的變更對(duì)調(diào)用者透明。1、什么是工廠模式Define an interface for creating an object,but let subclasses decide whi...
摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調(diào)用它來實(shí)現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個(gè)工廠創(chuàng)建所有產(chǎn)品(2)工廠方法模式:一個(gè)工廠方法創(chuàng)建一個(gè)產(chǎn)品(3)抽象工廠模式:一個(gè)工廠方法創(chuàng)建一類產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實(shí)例的創(chuàng)建和使用分離開來,隱藏類實(shí)例的創(chuàng)建細(xì)節(jié),外界...
摘要:不過怎么來說工廠方法模式是簡單工廠模式的升級(jí)版。其次,工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現(xiàn)的尤為明顯。 工廠模式想必大家在開發(fā)過程中會(huì)經(jīng)常用到,顧名思義其就是作為一個(gè)工廠用來生產(chǎn)產(chǎn)品的,下面來簡單介紹幾種常見的工廠模式。 0x01 簡單工廠模式 1、類圖結(jié)構(gòu)showImg(/img/bVFf1t?w=531&h=278); 2、角色分類 工廠類:其內(nèi)部具有一點(diǎn)的判...
摘要:我認(rèn)為按書上的順序比較好理解因?yàn)楹唵戊o態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強(qiáng)。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復(fù)雜了,我們一般的應(yīng)用都寫不到。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會(huì)幾種寫法? 昨天寫了單例模式了,今天是時(shí)候?qū)懝S模式啦~ 工廠模式我個(gè)人認(rèn)為其實(shí)比...
閱讀 3338·2023-04-26 03:05
閱讀 1459·2019-08-30 13:09
閱讀 1908·2019-08-30 13:05
閱讀 887·2019-08-29 12:42
閱讀 1385·2019-08-28 18:18
閱讀 3447·2019-08-28 18:09
閱讀 513·2019-08-28 18:00
閱讀 1713·2019-08-26 12:10