定義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類
不同子類可能會有不同的實現,不同的代碼,在不修改已存在類情況下,去擴展已有類的方法,並且實例化的過程延遲到客戶端代碼執行過程中,即多態。。
才規矩,上個例子,依然來自《大話設計模式》
首先是一個類,可以認爲是已存在的不可修改的類,可能來自網絡/文本/jar包等等
public class LeiFeng
{
public void sweep()
{
System.out.println("掃地");
}
public void wash()
{
System.out.println("洗衣");
}
}
一種實現,這裏是學生學 LeiFeng 做好事
public class Undergraduate extends LeiFeng
{
@Override
public void sweep()
{
System.out.println("undergraduate sweep");
}
@Override
public void wash()
{
System.out.println("undergraduate wash");
}
}
另一種實現,這裏是志願者學 LeiFeng 做好事
public class Volunteer extends LeiFeng
{
@Override
public void sweep()
{
System.out.println("volunteer sweep");
}
@Override
public void wash()
{
System.out.println("volunteer wash");
}
}
工廠方法,創建一個 LeiFeng
public interface IFactory
{
LeiFeng createLeiFeng();
}
創建哪個 LeiFeng,這裏創建學生
public class UndergraduateFactory implements IFactory
{
public LeiFeng createLeiFeng()
{
return new Undergraduate();
}
}
創建哪個 LeiFeng ,這裏創建志願者
public class VolunteerFactory implements IFactory
{
public LeiFeng createLeiFeng()
{
return new Volunteer();
}
}
客戶端代碼,可以修改factory, 的實現,如factory = new UndergraduateFacotry()
, 就可以創建一個學生 LeiFeng ,這樣不需要修改已有代碼,如果來一個男 LeiFeng,只需要加 Male
繼承LeiFeng,MaleFactory
實現 IFactory 創建方法即可
public class FactoryMain
{
public static void main(String[] args)
{
IFactory factory = new VolunteerFactory();
LeiFeng student = factory.createLeiFeng();
student.wash();
student.sweep();
}
}
總結
將創建具體對象延遲到客戶端調用時,這樣工廠類中就不需要加業務代碼。