JAVA设计模式笔记(简单工厂模式)
有一個水果加工工廠,我們的需求是實現加工水果的功能。常見的做法是創建一個水果抽象類,寫一個抽象的加工方法,然后創建具體的水果類去繼承抽象類,再去實現抽象方法,最后客戶端再去新建對象實例。
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();} }這種做法的缺點是將用戶和水果緊密耦合了,用戶需要知道創建水果對象的過程,如果創建對象的過程比較復雜,那么客戶端每次需要創建對象時將寫入大段的代碼。因此,我們需要定義一個創建對象的類,由這個類專門生成這個對象的實例,這就引出了工廠模式
工廠模式可以分為三類:
1)簡單工廠模式(Simple Factory)
2)工廠方法模式(Factory Method)
3)抽象工廠模式(Abstract Factory)
簡單工廠模式
簡單工廠模式:定義了一個創建對象的類,由這個類來封裝實例化對象
對于上面的例子,我們不改動水果類的代碼,只需要創建一個簡單工廠類去產生水果的實例
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();} }這樣對象的創建就被簡單工廠類封裝起來了,用戶不需要了解創建對象的過程,達到了解耦的目的。
但是簡單工廠模式違反了開閉原則,即對擴展開放、對修改關閉。如果需要新增加水果種類,那么就必須要新增if語句。
適用場景
1、需要創建的對象較少
2、客戶端不關心對象的創建過程
簡單工廠類的角色分配
1、抽象產品角色
所有產品的父類,描述所有實例共有的方法
2、具體產品角色
簡單工廠類的創建目標,具體實現了抽象產品的方法
3、工廠角色
負責實現創建所有實例的內部邏輯,工廠類可以被外部調用,創建所需的產品對象
2、工廠方法模式
工廠方法模式不再使用統一的工廠類去新建每一個對象,而是創建一個工廠抽象類,然后再針對每一個具體的產品類去創建一個具體的工廠類。
工廠類
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();} }這樣的好處是當有新的水果種類時只需要新創建一個工廠類而不需要修改工廠類的代碼。但是也帶來了問題,每增加一個產品類就需要新創建一個工廠類,增加了開發的工作量。
適用場景
1、客戶端不關心對象的創建過程,只需要了解創建對象的具體工廠子類
工廠類的角色分配
1、抽象產品角色
所有產品的父類,描述所有實例共有的方法
2、具體產品角色
具體實現了抽象產品的方法,每個產品類都對應一個工廠類
3、抽象工廠角色
定義了創建實例的接口,所有工廠類都要實現這個接口
4、具體工廠角色
實現抽象工廠接口的具體工廠類,包含創建某一種產品對象的邏輯。
抽象工廠模式
抽象工廠不僅僅可以生產一種產品,而是可以生產一組產品,這些產品是互相關聯的。
現在有一個工廠需要生產水果和果汁,那么就需要抽象工廠。抽象工廠與普通工廠的區別是一個工廠對象可以創建一組相關的對象,而普通工廠是一個工廠對象只能創建一種對象。
產品類
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、需要創建一組對象去實現功能。
2、系統結構穩定,不會頻繁增加對象,如果一旦增加對象,那么就需要再抽象工廠類中修改代碼,違反了開閉原則。
總結
以上是生活随笔為你收集整理的JAVA设计模式笔记(简单工厂模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS原生编写飞机大战小蜜蜂游戏
- 下一篇: 4个手机使用必备小常识,没几个人全知道,