設計模式-創建型-工廠模式(SimpleFactory簡單工廠,FactoryMethod工廠方法)

設計模式-創建型-工廠模式(SimpleFactory簡單工廠,FactoryMethod工廠方法)

在面向對象編程中, 最常見的是使用new來創建一個對象實例,new操作符就是用來構造對象實例的。但是在一些情況下, new操作符直接生成對象會帶來一些問題。舉例來說, 許多類型對象的創造需要一系列的步驟: 你可能需要計算或取得對象的初始設置; 選擇生成哪個子對象實例; 或在生成你需要的對象之前必須先生成一些輔助功能的對象。 在這些情況,新對象的建立就是一個 “過程”,不僅是一個操作,像一部大機器中的一個齒輪傳動。

簡單工廠

簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解爲是不同工廠模式的一個特殊實現。值得注意的是,簡單工廠模式並不屬於23種GOF設計模式之一

  • 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由 一個具體類實現。(OperationFactory)
  • 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。在java中由接口或者抽象類來實現。(Operation)
  • 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。 來用類圖來清晰的表示下的它們之間的關係(OperationAdd\OperationSub等)

優點:

  • 只有一個具體的工廠類來創建對象,代碼量少

缺點:

  • 當需求改變需要修改源碼

工廠類,通過一定的判斷,選擇,創建並返回具體實現類

public class AnimalFactory {
    public static Dog createDog() {
        return new Dog();
    }

    public static Cat createCat() {
        return new Cat();
    }


    // 外界想要貓要狗,這裏創建就好了
    public static Animal createAnimal(String type) {
        if ("dog".equals(type)) {
            return new Dog();
        } else if ("cat".equals(type)) {
            return new Cat();
        } else {
            return null;
        }
    }
}

抽象類與底層具體實現類

public abstract class Animal {
    // 所有的動物都會喫東西
    public abstract void eat();
}
public class Cat extends Animal {
    // 貓喜歡喫魚
    @Override
    public void eat() {
        System.out.println("貓喫魚");
    }
}
public class Dog extends Animal {
    // 狗喜歡喫肉
    @Override
    public void eat() {
        System.out.println("狗喫肉");
    }
}

工廠方法

簡單工廠每次修改需求都需要修改源代碼,如果實現類數量增加,工廠實現類難以維護。
工廠方法:將工廠實現類抽象成接口,爲每一個具體的實體類都創建一個對應的實現工廠,通過創建對應的實現工廠來獲取對應實體類的對象
優點:

  • 客戶端不需要在負責對象的創建,明確了各個類的職責
  • 如果需求變化,只需要添加或減少一個實體類和對應的具體的實現工廠即可
  • 不會影響已有代碼,便於後期維護,增強系統的擴展性

缺點:

  • 需要額外編寫代碼,增加了工作量
//寵物工廠接口
public interface AnimalFactory {
    // 獲取對應實體類對象的接口
    Animal createAnimal();
}
// 繼承着寵物工廠
public class CatFactory implements AnimalFactory {
    @Override
    // 創建貓
    public Animal createAnimal() {
        return new Cat();
    }
}
// 繼承着寵物工廠
public class DogFactory implements AnimalFactory {
    // 創建狗
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

使用樣例,通過對應工廠獲取實體類

// 去找狗工廠拿一隻狗過來
AnimalFactory f = new DogFactory();
// 店主就拿到了一隻狗給
Animal a = f.createAnimal();
a.eat();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章