摘要:類型創(chuàng)建型,但不屬于中設(shè)計(jì)模式。簡介通過一個專門的工廠類來創(chuàng)建其他類,這些被創(chuàng)建的類通常有一個共同的父類或接口。相關(guān)代碼簡單工廠模式推薦閱讀慕課網(wǎng)設(shè)計(jì)模式精講簡單工廠模式
0x01.定義與類型
定義:由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。
類型:創(chuàng)建型,但不屬于GOF23中設(shè)計(jì)模式。
簡介:通過一個專門的工廠類來創(chuàng)建其他類,這些被創(chuàng)建的類通常有一個共同的父類或接口。
uml類圖
代碼
//產(chǎn)品接口 public interface IProduct { void produce(); } //產(chǎn)品實(shí)現(xiàn) public class Product implements IProduct{ @Override public void produce() { System.out.println("產(chǎn)品邏輯"); } } //產(chǎn)品工廠 public class ProductFactory { public static IProduct createProduct(String name) { Product product = null; if ("product".equals(name)) { product = new Product(); } return product; } }
應(yīng)用或測試
public class Test { public static void main(String[] args) { IProduct product = ProductFactory.createProduct("product"); product.produce(); } }
輸出結(jié)果
產(chǎn)品邏輯
通過簡單工廠模式,可以看到有三個要素
產(chǎn)品接口:產(chǎn)品接口的主要目的是定義產(chǎn)品的規(guī)范,所有的產(chǎn)品實(shí)現(xiàn)都必須遵循產(chǎn)品接口定義的規(guī)范。產(chǎn)品接口是調(diào)用者最為關(guān)心的,產(chǎn)品接口定義的優(yōu)劣直接決定了調(diào)用者代碼的穩(wěn)定性。同樣,產(chǎn)品接口也可以用抽象類來代替,但要注意最好不要違反里氏替換原則。
產(chǎn)品實(shí)現(xiàn):實(shí)現(xiàn)產(chǎn)品接口的具體類,決定了產(chǎn)品在客戶端中的具體行為。
產(chǎn)品工廠:靜態(tài)方法用來生產(chǎn)產(chǎn)品,與調(diào)用者直接交互用來提供產(chǎn)品。一般使用靜態(tài)方法提供,注意當(dāng)變更發(fā)生時(shí),這個類違反了開閉原則。
0x02.適用場景工廠類負(fù)責(zé)創(chuàng)建的對象比較少
客戶端(應(yīng)用層)只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心
0x03.簡單工廠的優(yōu)缺點(diǎn)優(yōu)點(diǎn):只需要傳入一個正確的參數(shù),就可以獲取你所需要的對象,而無須知道其創(chuàng)建細(xì)節(jié)
缺點(diǎn):工廠類的職責(zé)相對過重,增加新的產(chǎn)品,需要修改工廠類的判斷邏輯,違背開閉原則
0x04.簡單工廠的實(shí)線樣例假設(shè)IT教育課程,具有Java, Python等視頻。他們都是視頻類的子類,而有多帶帶的視頻工廠生產(chǎn)這些課程!
課程基類
public abstract class Video { public abstract void produce(); }
視頻工廠
public class VideoFactory { /** * 每次新增加產(chǎn)品實(shí)線會修改代碼 * 不符合開閉原則 * @param type * @return */ public Video getVideo(String type) { if ("java".equalsIgnoreCase(type)) { return new JavaVideo(); } else if ("python".equalsIgnoreCase(type)) { return new PythonVideo(); } else return null; } /** * 反射方式實(shí)現(xiàn) * @param clazz * @return */ public Video getVideo(Class clazz) { Video video = null; try { video = (Video) Class.forName(clazz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return video; } }
Java, Python視頻的具體實(shí)線類
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 JavaVideo(); // video.produce(); // } public static void main(String[] args) { VideoFactory videoFactory = new VideoFactory(); Video video1 = videoFactory.getVideo("python"); if (video1 != null) { video1.produce(); } Video video2 = videoFactory.getVideo("java"); if (video2 != null) { video2.produce(); } } /* public static void main(String[] args) { VideoFactory videoFactory = new VideoFactory(); Video video = videoFactory.getVideo(PythonVideo.class); if (video != null) { video.produce(); } }*/ }
輸出結(jié)果
錄制Python課程 錄制Java課程視頻0x05.UML類圖
如圖uml所示:直接的應(yīng)用類中并沒有于具體實(shí)現(xiàn)類的耦合,這樣當(dāng)新增具體實(shí)現(xiàn)類時(shí)是不需要修改應(yīng)用層業(yè)務(wù)邏輯
0x06.源碼中的簡單工廠Calendar.createCalendar():JDK時(shí)間處理類
//根據(jù)輸入?yún)?shù)區(qū)分的具體實(shí)現(xiàn) if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { switch (caltype) { case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } }
jdbc的Class.forname("com.mysql.driver"):通過每個db推出的不同的驅(qū)動,通過反射創(chuàng)建出連接。
0x07.相關(guān)代碼簡單工廠模式:https://github.com/sigmako/design-pattern/tree/master/simple-factory
0x08.推薦閱讀慕課網(wǎng)設(shè)計(jì)模式精講: https://coding.imooc.com/class/270.html
簡單工廠模式:https://blog.csdn.net/weiwenlongll/article/details/6918164
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74721.html
摘要:工廠模式其實(shí)可以劃分為簡單工廠模式工廠方法模式抽象工廠模式等。簡單工廠模式介紹簡單工廠模式又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。此模式是對工廠方法模式的進(jìn)一步擴(kuò)展。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設(shè)計(jì)模式——工廠模式周三:PHP面試常考之設(shè)計(jì)模式——建造者模式周五:PHP...
摘要:但本質(zhì)是,簡單工廠并未嚴(yán)格遵循設(shè)計(jì)模式的開閉原則,當(dāng)需要增加新產(chǎn)品時(shí)也需要修改工廠代碼。但是工廠方法則嚴(yán)格遵守開閉原則,模式只負(fù)責(zé)抽象工廠接口,具體工廠交給客戶去擴(kuò)展。 最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第二篇創(chuàng)建型模式之工廠模式。 設(shè)計(jì)模式的一般介紹在第一篇文章講了,這里就不重復(fù)。 工廠模式 實(shí)現(xiàn):定義一個用于創(chuàng)建對象的接口,讓子類決定實(shí)...
摘要:需要說明的是在設(shè)計(jì)模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式,將簡單工廠模式看為工廠方法模式的一種特例,兩者歸為一類。工廠模式的作用工廠模式的作用封裝變化創(chuàng)建邏輯有可能變化,封裝成工廠類之后,創(chuàng)建邏輯的變更對調(diào)用者透明。1、什么是工廠模式Define an interface for creating an object,but let subclasses decide whi...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...
摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個類別的產(chǎn)品還有多個系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態(tài)工廠模式1.將對象的創(chuàng)建和使用分開;2.將生產(chǎn)過程集中,便于集中管理;3.當(dāng)需要創(chuàng)建的對象類有變動時(shí),就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...
摘要:設(shè)計(jì)模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點(diǎn)進(jìn)行優(yōu)化。 設(shè)計(jì)模式之工廠模式 工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實(shí)際應(yīng)用的角度分別介紹這三種模式。 簡單工廠模式 下面看下JDBC中獲取Connection的代碼 public class ConnectionFactory { public Con...
閱讀 2893·2021-09-28 09:36
閱讀 3647·2021-09-27 13:59
閱讀 2497·2021-08-31 09:44
閱讀 2285·2019-08-30 15:54
閱讀 2359·2019-08-30 15:44
閱讀 1192·2019-08-30 13:45
閱讀 1231·2019-08-29 18:38
閱讀 1219·2019-08-29 18:37