31天重构学习笔记19. 提取工厂类
概念:本文中的“提取工廠類”是指如果要創建的對象很多,則代碼會變的很復雜。一種很好的方法就是提取工廠類。
?
正文:一般來說我們需要在代碼中設置一些對象,以便獲得它們的狀態,從而使用對象,所謂的設置通常來說就是創建對象的實例并調用對象的方法。有時如果要創建的對象很多,則代碼會變的很復雜。這便是工廠模式發揮作用的情形。工廠模式的復雜應用是使用抽象工廠創建對象集,但我們在這里只是使用基本的工廠類創建對象的一個簡單應用。
如下代碼所示,New方法包含創建類的整個邏輯,如果現在要創建的類比較多而且邏輯比較復雜的話(如根據不同條件創建對象,什么時候創建對象),我們的New方法邏輯會變得很大,同時代碼也變得很難維護。所以我們就會采用提取工廠類的方式進行提煉。
namespace?LosTechies.DaysOfRefactoring.ExtractServiceClass.Before?
{?
????public class?PoliceCarController?
???{?
????????public?PoliceCar New(int?mileage,?bool?serviceRequired)?
??????? {?
??????????? PoliceCar policeCar =?new?PoliceCar();?
??????????? policeCar.ServiceRequired = serviceRequired;?
??????????? policeCar.Mileage = mileage;?
????????????return?policeCar;?
??????? }?
??? }?
}
那么重構后的代碼如下,New方法變得很簡單了,指需要調用實現接IPoliceCarFactory?接口的PoliceCarFactory?類就可以返回對象,這樣就隔開了創建對象的邏輯,如果需求現在變為根據不同的條件創建不同的對象,什么時候創建對象等都變成了比較簡單的事情,在后期可以把對象都配置在XML里面,使用反射的方式實現IOC注入創建。
namespace LosTechies.DaysOfRefactoring.ExtractServiceClass.After{
public interface IPoliceCarFactory
{
PoliceCar Create(int mileage, bool serviceRequired);
}
public class PoliceCarFactory : IPoliceCarFactory
{
public PoliceCar Create(int mileage, bool serviceRequired)
{
PoliceCar policeCar = new PoliceCar();
policeCar.ReadForService = serviceRequired;
policeCar.Mileage = mileage;
return policeCar;
}
}
public class PoliceCarController
{
public IPoliceCarFactory PoliceCarFactory { get; set; }
public PoliceCarController(IPoliceCarFactory policeCarFactory)
{
PoliceCarFactory = policeCarFactory;
}
public PoliceCar New(int mileage, bool serviceRequired)
{
return PoliceCarFactory.Create(mileage, serviceRequired);
}
}
}
總結:這個重構經常會在項目中使用,如果要創建的對象是一個,你可以采用簡單工廠,但是這種方式還是會存在很多依賴,維護起來也比較不方便。所以推薦使用工廠方法模式,把實例化延遲到子類。如果你要創建一系列的對象,那么就推薦你使用抽象工廠模式,但是要注意不要過度設計,只要能滿足不斷變化的需求和給以后的維護和重構帶來方便即可。
轉載于:https://www.cnblogs.com/ywsoftware/archive/2013/02/05/2892607.html
總結
以上是生活随笔為你收集整理的31天重构学习笔记19. 提取工厂类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt加载gif动态图
- 下一篇: WIN10电脑自动关机命令