通過抽象工廠模式再理解java的上轉型
阿新 • • 發佈:2019-02-17
最近在學習抽象工廠模式的時候,看到了他的優點之一---分離了具體的類。抽象工廠模式幫助你控制一個應用建立的物件的類,因為一個工廠封裝建立產品物件的責任和過程。
它將客戶和類的實現分離,客戶通過他們的抽象介面操縱例項,產品的類名也在具體工廠的實現中被分離,它們不出現在客戶程式碼中。
一個抽象的工廠的介面
public interface AbstractFactory{
//具體方法略過
public Food getFood();
}
一個具體的工廠的實現
public class ConcreteFactory implements AbstractFactory{
public Food getFood(){
return new Milk();
}
public Water getWater(){
return new Water();
}
}
因為是說上轉型的理解問題,所以產品就略過了。
直接client程式碼
public class Client{
public void eat(AbstractFactory abs){
System.out.println("A person eat "+k.getFood().getEatable()
+" with "+k.getTableWare().getTool()+"!");
}
關鍵說應用,看看client是怎麼呼叫抽象工廠的,以及實現了怎樣的分離。
Client client= new Client();
AbstractFactory cf = new ConcreteFactory();
client.eat(cf);
就是紅色標註部分,有人告訴我說我可以傳另一個具體工廠給client,例如
cf = new ConcreteAAFactory();
所以說,對於client來說,生產的產品對自己來說是可見的,客戶和生產類是沒有分離的!!
無語!!!這裡涉及到了一個很基本的java知識---上轉型問題。
我們在eat的時候確實是具體工廠的getFood方法,但是,你要看清楚
AbstractFactory cf = new ConcreteFactory();
通過這個之後,cf已經是AbstractFactory型別,他將為這一次轉換付出代價的,
它將客戶和類的實現分離,客戶通過他們的抽象介面操縱例項,產品的類名也在具體工廠的實現中被分離,它們不出現在客戶程式碼中。
一個抽象的工廠的介面
public interface AbstractFactory{
//具體方法略過
public Food getFood();
}
一個具體的工廠的實現
public class ConcreteFactory implements AbstractFactory{
public Food getFood(){
return new Milk();
}
public Water getWater(){
return new Water();
}
}
因為是說上轉型的理解問題,所以產品就略過了。
直接client程式碼
public class Client{
public void eat(AbstractFactory abs){
System.out.println("A person eat "+k.getFood().getEatable()
+" with "+k.getTableWare().getTool()+"!");
}
關鍵說應用,看看client是怎麼呼叫抽象工廠的,以及實現了怎樣的分離。
Client client= new Client();
AbstractFactory cf = new ConcreteFactory();
client.eat(cf);
就是紅色標註部分,有人告訴我說我可以傳另一個具體工廠給client,例如
cf = new ConcreteAAFactory();
所以說,對於client來說,生產的產品對自己來說是可見的,客戶和生產類是沒有分離的!!
無語!!!這裡涉及到了一個很基本的java知識---上轉型問題。
我們在eat的時候確實是具體工廠的getFood方法,但是,你要看清楚
AbstractFactory cf = new ConcreteFactory();
通過這個之後,cf已經是AbstractFactory型別,他將為這一次轉換付出代價的,