JAVA设计模式笔记(简单工厂模式)
有一個水果加工工廠,我們的需求是實現(xiàn)加工水果的功能。常見的做法是創(chuàng)建一個水果抽象類,寫一個抽象的加工方法,然后創(chuàng)建具體的水果類去繼承抽象類,再去實現(xiàn)抽象方法,最后客戶端再去新建對象實例。
public abstract class Fruit {abstract void make(); } public class Apple extends Fruit{@Overridevoid make() {System.out.println("加工蘋果");} } public class Pear extends Fruit {@Overridevoid make() {System.out.println("加工雪梨");} } public class Customer {public static void main(String[] args) {Apple a=new Apple();Pear p=new Pear();a.make();p.make();} }這種做法的缺點是將用戶和水果緊密耦合了,用戶需要知道創(chuàng)建水果對象的過程,如果創(chuàng)建對象的過程比較復(fù)雜,那么客戶端每次需要創(chuàng)建對象時將寫入大段的代碼。因此,我們需要定義一個創(chuàng)建對象的類,由這個類專門生成這個對象的實例,這就引出了工廠模式
工廠模式可以分為三類:
1)簡單工廠模式(Simple Factory)
2)工廠方法模式(Factory Method)
3)抽象工廠模式(Abstract Factory)
簡單工廠模式
簡單工廠模式:定義了一個創(chuàng)建對象的類,由這個類來封裝實例化對象
對于上面的例子,我們不改動水果類的代碼,只需要創(chuàng)建一個簡單工廠類去產(chǎn)生水果的實例
public class SimpleFactory {public static Fruit create(String type){Fruit fruit=null;if(type=="apple")fruit=new Apple();if(type=="pear")fruit=new Pear();return fruit;} }客戶端使用
public class Customer {public static void main(String[] args) {Apple a=(Apple)SimpleFactory.create("apple");Pear p= (Pear)SimpleFactory.create("pear");a.make();p.make();} }這樣對象的創(chuàng)建就被簡單工廠類封裝起來了,用戶不需要了解創(chuàng)建對象的過程,達到了解耦的目的。
但是簡單工廠模式違反了開閉原則,即對擴展開放、對修改關(guān)閉。如果需要新增加水果種類,那么就必須要新增if語句。
適用場景
1、需要創(chuàng)建的對象較少
2、客戶端不關(guān)心對象的創(chuàng)建過程
簡單工廠類的角色分配
1、抽象產(chǎn)品角色
所有產(chǎn)品的父類,描述所有實例共有的方法
2、具體產(chǎn)品角色
簡單工廠類的創(chuàng)建目標(biāo),具體實現(xiàn)了抽象產(chǎn)品的方法
3、工廠角色
負(fù)責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯,工廠類可以被外部調(diào)用,創(chuàng)建所需的產(chǎn)品對象
2、工廠方法模式
工廠方法模式不再使用統(tǒng)一的工廠類去新建每一個對象,而是創(chuàng)建一個工廠抽象類,然后再針對每一個具體的產(chǎn)品類去創(chuàng)建一個具體的工廠類。
工廠類
public interface Factory {Fruit create(String type); } public class AppleFactory implements Factory {@Overridepublic Fruit create(String type) {Apple apple=new Apple();return apple;} } public class PearFactory implements Factory{@Overridepublic Fruit create(String type) {Pear p=new Pear();return p;} }客戶端
public class Customer {public static void main(String[] args) {Factory factory=new AppleFactory();Factory factory1=new PearFactory();Apple a=(Apple)factory.create("apple");Pear p=(Pear)factory1.create("pear");a.make();p.make();} }這樣的好處是當(dāng)有新的水果種類時只需要新創(chuàng)建一個工廠類而不需要修改工廠類的代碼。但是也帶來了問題,每增加一個產(chǎn)品類就需要新創(chuàng)建一個工廠類,增加了開發(fā)的工作量。
適用場景
1、客戶端不關(guān)心對象的創(chuàng)建過程,只需要了解創(chuàng)建對象的具體工廠子類
工廠類的角色分配
1、抽象產(chǎn)品角色
所有產(chǎn)品的父類,描述所有實例共有的方法
2、具體產(chǎn)品角色
具體實現(xiàn)了抽象產(chǎn)品的方法,每個產(chǎn)品類都對應(yīng)一個工廠類
3、抽象工廠角色
定義了創(chuàng)建實例的接口,所有工廠類都要實現(xiàn)這個接口
4、具體工廠角色
實現(xiàn)抽象工廠接口的具體工廠類,包含創(chuàng)建某一種產(chǎn)品對象的邏輯。
抽象工廠模式
抽象工廠不僅僅可以生產(chǎn)一種產(chǎn)品,而是可以生產(chǎn)一組產(chǎn)品,這些產(chǎn)品是互相關(guān)聯(lián)的。
現(xiàn)在有一個工廠需要生產(chǎn)水果和果汁,那么就需要抽象工廠。抽象工廠與普通工廠的區(qū)別是一個工廠對象可以創(chuàng)建一組相關(guān)的對象,而普通工廠是一個工廠對象只能創(chuàng)建一種對象。
產(chǎn)品類
public abstract class Fruit {abstract void make(); }public class Apple extends Fruit {@Overridevoid make() {System.out.println("加工蘋果");} }public abstract class Juice {public abstract void make(); }public class AppleJuice extends Juice {@Overridepublic void make() {System.out.println("制作蘋果汁");} }工廠類
public interface Factory {Fruit createFruit();Juice createJuice(); }public class AppleFactory implements Factory {@Overridepublic Fruit createFruit() {Apple a=new Apple();return a;}@Overridepublic Juice createJuice() {AppleJuice j=new AppleJuice();return j;} }客戶端
public class Customer {public static void main(String[] args) {Factory factory=new AppleFactory();Apple a=(Apple)factory.createFruit();AppleJuice appleJuice=(AppleJuice) factory.createJuice();a.make();appleJuice.make();} }適用場景
1、需要創(chuàng)建一組對象去實現(xiàn)功能。
2、系統(tǒng)結(jié)構(gòu)穩(wěn)定,不會頻繁增加對象,如果一旦增加對象,那么就需要再抽象工廠類中修改代碼,違反了開閉原則。
總結(jié)
以上是生活随笔為你收集整理的JAVA设计模式笔记(简单工厂模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS原生编写飞机大战小蜜蜂游戏
- 下一篇: 设计模式(二)简单工厂模式