設計模式-創建型-工廠模式(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();