java設(shè)計模式學(xué)習(xí)之工廠方法模式
工廠方法模式(Factory Method):定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
工廠方法模式結(jié)構(gòu)圖:
項目需求,創(chuàng)建一個雷鋒工廠,大學(xué)生可以去幫助別人,志愿者也可以幫助別人做事情。
1:創(chuàng)建一個雷鋒類,具有幫助別人掃地,洗衣,買米的功能。
package FactoryMethodModel; public class LeiFeng { public void Sweep(){ System.out.println("掃地"); } public void Wash(){ System.out.println("洗衣"); } public void BuyRice(){ System.out.println("買米"); } }
2:創(chuàng)建一個學(xué)雷鋒的大學(xué)生的類,繼承雷鋒類,可增加自己的功能。
package FactoryMethodModel; /** * 學(xué)雷鋒的大學(xué)生 * @author 我不是張英俊 * */ public class UniversityStudent extends LeiFeng { //里面可以增加專屬大學(xué)生的功能 }
3:創(chuàng)建一個社區(qū)志愿者的類,繼承雷鋒類。
package FactoryMethodModel; /** * 學(xué)雷鋒的社區(qū)人員 * @author 我不是張英俊 * */ public class Volunteer extends LeiFeng { }
4:創(chuàng)建一個雷鋒工廠接口。
package FactoryMethodModel; /**雷鋒工廠的總接口。 * @author 我不是張英俊 * */ interface LeiFengFactory { LeiFeng CreatLenFeng(); }
5:創(chuàng)建學(xué)雷鋒的大學(xué)生的工廠。
package FactoryMethodModel; /** * 學(xué)雷鋒的大學(xué)生工廠 * @author 我不是張英俊 * */ public class UniversityStudentFactory implements LeiFengFactory { @Override public LeiFeng CreatLenFeng() { return new UniversityStudent(); } }
6:創(chuàng)建學(xué)雷鋒的志愿者工廠。
package FactoryMethodModel; /** * 學(xué)雷鋒的社區(qū)制志愿者 * @author 我不是張英俊 * */ public class VolunteerFactory implements LeiFengFactory { @Override public LeiFeng CreatLenFeng() { // TODO Auto-generated method stub return new Volunteer(); } }
7:測試類
package FactoryMethodModel; /** * 建立一個雷鋒工廠,大學(xué)生可以以雷鋒的名義起幫助別人,社區(qū)志愿者也可以。 * 工廠化模式:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。 * 工廠方法使一個類的實例化延遲到其子類。 * @author 我不是張英俊 * */ public class Test { public static void main(String[] args) { LeiFengFactory factory=new UniversityStudentFactory(); LeiFeng student =factory.CreatLenFeng(); student.BuyRice(); student.Sweep(); student.Wash(); } }
8:控制臺
買米
掃地
洗衣
總結(jié):簡單工廠方法違背了開放-封閉原則,而工廠方法克服了此問題,當(dāng)需要增加新的,例如小學(xué)生學(xué)雷鋒的時候,工廠方法增加新的小學(xué)生工廠即可,然后再測試類中調(diào)用即可。
工廠方法模式還保持了封裝對象創(chuàng)建過程的有點。使得要更換對象的時候,不需要做打的改動就可以實現(xiàn),降低了客戶程序與產(chǎn)品對象的耦合,工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠模式保存了簡單工廠模式的有點,并且克服了缺點。但缺點是,沒增加一個產(chǎn)品,就必須增加一個工廠類,增加的額外的開發(fā)量。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot @ConfigurationProperties注解的簡單使用
即便現(xiàn)在簡化了配置,但是一個獨立的配置文件總是易于理解而且使人安心的。Spring在構(gòu)建完項目后,會默認(rèn)在resources文件夾下創(chuàng)建一個application.properties文件,application.yml也是一樣的效果。@ConfigurationProperties可以獲取配置文件中的數(shù)據(jù),將其注入類。2021-05-05詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案
這篇文章主要介紹了詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java中反射的"暴破"機制(SetAccessible方法)詳解
這篇文章主要為大家詳細(xì)介紹了Java中反射的"暴破"機制,以及如何利用這一機制實現(xiàn)訪問非公有屬性,方法,和構(gòu)造器,文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08JavaScript實現(xiàn)鼠標(biāo)移動粒子跟隨效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)鼠標(biāo)移動粒子跟隨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08SpringCloud?Nacos服務(wù)分級存儲模型詳解
Nacos服務(wù)分級存儲模型是Nacos存儲服務(wù)注冊信息和配置信息的核心模型之一,本文將對?Nacos?服務(wù)分級存儲模型進(jìn)行深入解析,感興趣的朋友一起看看吧2024-02-02