摘要:場景一個發送者可以發送郵件或者短信,為日后擴展發送文件功能,可以定義短信工廠和郵件工廠生產發送者,為方便管理,提供一個工廠管理類負責生成工廠實例,其能保證生成的工廠實例唯一。短信工廠郵件工廠
描述:對象的新建統一由工廠創建,避免客戶端直接通過構造方法新建實例;對于創建對象的工廠可以可以使其在整個應用中保持唯一的實例,避免過多的垃圾工廠對象。
場景:一個<發送者>可以發送郵件或者短信,為日后擴展發送文件功能,可以定義短信工廠和郵件工廠生產<發送者>,為方便管理,提供一個工廠管理類負責生成工廠實例,其能保證生成的工廠實例唯一。
實現:
定義發送者:
interface Sender { public void send(String message); }
實現短信發送者:
class SmsSender implements Sender { @Override public void send(String message) { System.out.println("發送短信:" + message); } }
實現郵件發送者:
class EmailSender implements Sender { @Override public void send(String message) { System.out.println("發送郵件:" + message); } }
定義工廠,專門負責生產發送者:
interface Factory { Sender getSender(); }
定義一個具體的短信發送者工廠:
class SmsFactory implements Factory { @Override public Sender getSender() { return new SmsSender(); } }
定義一個具體的郵件發送者工廠:
class EmailFactory implements Factory { @Override public Sender getSender() { return new EmailSender(); } }
定義一個工廠管理者,負責生成具體的工廠實例;這里特意使用兩種方式生成工廠實例,基本保證了并發情況下生成工廠的唯一實例;對于同步的實現,僅有在工廠為空的情況下才存在同步。
class FactoryManager { private static class SingletoSmsFactory { private static Factory instance = new SmsFactory(); private static Factory getInstance() { return SingletoSmsFactory.instance; } } private static class SingletoEmailFactory { private static Factory instance = null; private static synchronized void initInstance() { if(null == instance) { instance = new EmailFactory(); } } private static Factory getInstance() { if(null == instance) { initInstance(); } return instance; } } public static Factory getFactory(Class clazz) { String className = clazz.getName(); Factory factory = null; if(className.equals(SmsFactory.class.getName())) { factory = SingletoSmsFactory.getInstance(); } if(className.equals(EmailFactory.class.getName())) { factory = SingletoEmailFactory.getInstance(); } return factory; } }
客戶端調用,循環10次是為了查看多次生成的工廠實例是否唯一。
public static void main(String[] args) { for(int i=0; i<10; i++) { Factory smsFactory = FactoryManager.getFactory(SmsFactory.class); Sender sender = smsFactory.getSender(); sender.send("hello world!"); System.out.println("短信工廠:" + smsFactory); Factory emailFactory = FactoryManager.getFactory(EmailFactory.class); sender = emailFactory.getSender(); sender.send("hello world!"); System.out.println("郵件工廠:" + emailFactory); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64029.html
摘要:最近開展了三次設計模式的公開課,現在來總結一下設計模式在中的應用,這是第一篇創建型模式之單例模式。不過因為不支持多線程所以不需要考慮這個問題了。 最近開展了三次設計模式的公開課,現在來總結一下設計模式在PHP中的應用,這是第一篇創建型模式之單例模式。 一、設計模式簡介 首先我們來認識一下什么是設計模式: 設計模式是一套被反復使用、容易被他人理解的、可靠的代碼設計經驗的總結。 設計模式不...
摘要:構造方法是在對象實例初始化過程中具有舉足輕重的地位,并且提供了多種方式來定義構造方法。在中創建對象的開銷是相當低的,并且速度很快。對象終結器前面我們講述的都是構造方法和對象初始化相關的主題,但還未提及他們的反面對象銷毀。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...
摘要:在工廠方法模式中,我們會遇到一個問題,當產品非常多時,繼續使用工廠方法模式會產生非常多的工廠類。從簡單工廠模式到抽象工廠模式,我們都是在用后一種模式解決前一種模式的缺陷,都是在最大程度降低代碼的耦合性。 單例模式 所謂單例模式,也就是說不管什么時候我們要確保只有一個對象實例存在。很多情況下,整個系統中只需要存在一個對象,所有的信息都從這個對象獲取,比如系統的配置對象,或者是線程池。這些...
摘要:總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。二餓漢式單例餓漢式單例類在類初始化時,已經自行實例化靜態工廠方法餓漢式在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不再改變,所以天生是線程安全的。 概念: Java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例。 單例模式有以下特點: 1、單例類只能有一個實例。 ...
摘要:本文介紹一些來自投資銀行的針對三年以上經驗的開發人員面試題。第七題和這兩個方法有什么不同答案本題取自我的投資銀行針對有經驗的開發者的五十個多線程面試題列表。總結以上就是投資銀行通常會出的面試題。 原文地址: https://dzone.com/articles/10... 有為數不少的開發者希望能在像 Barclays、Credit Suisse、Citibank 等等那樣的投資銀行做...
閱讀 1785·2023-04-26 00:47
閱讀 1543·2021-11-11 16:55
閱讀 2597·2021-09-27 14:04
閱讀 3548·2021-09-22 15:58
閱讀 3554·2021-07-26 23:38
閱讀 2129·2019-08-30 13:47
閱讀 1979·2019-08-30 13:15
閱讀 1142·2019-08-29 17:09