设计模式学习--------3.简单工厂模式学习
場景:
? ? ? ?服務(wù)端編寫API方法供客戶端調(diào)用,需要將接口與實(shí)現(xiàn)分離,客戶端不需要知道具體實(shí)現(xiàn),高度解耦,面向接口的編程。
定義:
? ? ? ? 提供一個(gè)創(chuàng)建對象實(shí)例的功能,而無須關(guān)心其具體實(shí)現(xiàn),被創(chuàng)建實(shí)例的類型可以是接口,抽象類,也可以是具體的類。
類比就像我們?nèi)スS進(jìn)貨,但是不知道具體貨物是如何產(chǎn)生的,可能從廣東進(jìn)貨,也可能從北京進(jìn)貨,原料的供貨商我們不清
楚,我們只向工廠要,工廠知道貨物從哪兒來,由工廠負(fù)責(zé)具體的調(diào)度,然后貨到了就給我們.
角色:
Api: 定義客戶所需要的功能接口??
package com.kris.study;public interface Api {public void operation(String s); }? ??
Impl:具體實(shí)現(xiàn)Api的實(shí)現(xiàn)類,可能有多個(gè)
package com.kris.study;public class ImplA implements Api{@Overridepublic void operation(String s) {System.out.println("implA s :"+s);}}?
package com.kris.study;public class ImplB implements Api{@Overridepublic void operation(String s) {System.out.println("ImplB s:"+s);}}Factory:工廠,選擇合適的實(shí)現(xiàn)類來創(chuàng)建Api接口對象
package com.kris.study;public class Factory {enum Condition {IMPLA,IMPLB}public static Api createApi(Condition condition){Api api = null;if(condition == Condition.IMPLA){api = new ImplA();}else if (condition == Condition.IMPLB){api = new ImplB();}return api;} }Client:客戶端,通過Factory來獲取Api接口對象,然后面向Api接口編程
package com.kris.study;import com.kris.study.Factory.Condition;public class Client {public static void main(String[] args) {Api api = Factory.createApi(Condition.IMPLA);api.operation("lisi");}}
原理分析:
簡單工廠內(nèi)部主要的實(shí)現(xiàn)功能是選擇合適的實(shí)現(xiàn)類。也就是需要一個(gè)選擇條件或者參數(shù),通常來源有三處
①.Client傳入,客戶端必須知道具體參數(shù)含義.
②.配置文件傳入,比如獲取XML中配置的實(shí)現(xiàn)類的名字通過反射得到具體實(shí)現(xiàn)類。
③.程序運(yùn)行期的某個(gè)值,比如從緩存中獲取的值。
優(yōu)點(diǎn):
封裝解耦
缺點(diǎn):
增加了客戶端的復(fù)雜度,如果是Client傳入,Client端就需要具體的含義和對應(yīng)的實(shí)現(xiàn)類.可以使用IOC配置文件傳入解決。
不方便擴(kuò)展。
思考:
簡單工廠將變化的地方交給工廠Factory來處理,使客戶端和實(shí)現(xiàn)類解耦.難點(diǎn)在于如何選擇,也就是傳入?yún)?shù)的方式。
?
轉(zhuǎn)載于:https://www.cnblogs.com/krislight1105/p/3748302.html
總結(jié)
以上是生活随笔為你收集整理的设计模式学习--------3.简单工厂模式学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】TCP的SEQ和ACK的生成
- 下一篇: 23个经典JDK设计模式(转)