抽象工廠模式(AbstractFactory)原理圖

初學uml不會排版,就這樣湊合吧,展現大概就行了
抽象,果然挺讓我理解的抽象的,其實一個挺簡單的模式,但是這樣亂亂的畫出來其實就是通過工廠創建出對象而已,只不過是對于工廠的分類方式和對于產品的分類方式不一樣了而已,上面是最合理的方式(起碼這個書上我是這么理解的),其實我自己覺得可以有別的方法
比如我不是按照產品的種類分類,按照產品的級別分類,就是簡單的把Product、AProductB替代1和2,這樣也可以的,就是用下面的代碼來說,非洲的獅子和美洲的獅子,都是獅子,但是非洲的獅子和非洲的海豚都是非洲的動物,一樣可以說的同,這樣就有多了一種方式去表達同一個模式,就像是上面的原理圖到了工廠這里就編程了通過商品實例化不同的級別,就像是下面的代碼,用非洲來實例化非洲的動物,這本身就是一種互相交互的東西,如果說把一類產品放到一起將來添加模塊的時候好添加,那么如果我想增加的是種類,或者是個別,那么總會有不好重構的一個地方的,不過對于一個對象的抽象,還是按照上面的抽象出來的實力比較具體一些而已,同時只要是抽象的工廠和抽象的對象不是按照一個區別來分的,就完全可以達到效果,我看了一些網上的設計模式的解析大部分也是按照上面的圖例做的,我覺得應該可以按照多種方式去考慮吧,只是不同人有不同的思路而已,大概是對于類的分類和繼承沒有像我這樣鉆縫子的。好吧,簡單的做一下筆記開始下一個模式,等長大一點了在慢慢鉆這個縫子(個人理解):
~~~
package com.designpattern.abstractfactory;
public interface Animal {
public void eat();
}
~~~
~~~
package com.designpattern.abstractfactory;
public class Dolphin implements Animal {
@Override
public void eat() {
System.out.println("Dolphin is eating");
}
public void swim(){
System.out.println("Dolphin is swimming");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AfricaDolphin extends Dolphin {
public void eat(){
System.out.println("AfricaDolphin is eating");
}
public void swim(){
System.out.println("AfricaDolphin is swimming");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AsiaDolphin extends Dolphin {
public void eat(){
System.out.println("AsiaDolphin is eating");
}
public void swim(){
System.out.println("AsiaDolphin is swimming");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class Tiger implements Animal {
@Override
public void eat() {
System.out.println("Tiger is eating");
}
public void run(){
System.out.println("Tiger is running");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AfricaTiger extends Tiger {
public void eat(){
System.out.println("AfricaTiger is eating");
}
public void run(){
System.out.println("AfricaTiger is running");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AsiaTiger extends Tiger {
public void eat(){
System.out.println("AsiaTiger is eating");
}
public void run(){
System.out.println("AsiaTiger is running");
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public interface Factory {
public Animal createTiger();
public Animal createDolphin();
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AsiaFactory implements Factory {
@Override
public Animal createDolphin() {
// TODO Auto-generated method stub
return new AsiaDolphin();
}
@Override
public Animal createTiger() {
// TODO Auto-generated method stub
return new AsiaTiger();
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class AfricaFactory implements Factory {
@Override
public Animal createDolphin() {
// TODO Auto-generated method stub
return new AfricaDolphin();
}
@Override
public Animal createTiger() {
// TODO Auto-generated method stub
return new AfricaTiger();
}
}
~~~
~~~
package com.designpattern.abstractfactory;
public class Client {
public static void main(String[] args) {
Factory factory = new AfricaFactory();
Animal tiger = factory.createTiger();
tiger.eat();
Animal dolphin = factory.createDolphin();
dolphin.eat();
factory = new AsiaFactory();
tiger = factory.createTiger();
tiger.eat();
dolphin = factory.createDolphin();
dolphin.eat();
}
}
~~~
在抽象工廠模式中,客戶端不在負責對象的創建,而是把這個責任交給了具體的工廠類,客戶端只負責對對象的調用,從而明確各個類的職責。
當一些類的互相關聯的產品被設計到一個工廠類里后,客戶端的調用將會變得非常簡單,而且如果要更換這一系列的產品,只需要跟換一個工廠類即可。
但是如果新的產品添加進來,則需要修改抽象工廠類的設計,同時修改實現這個抽象工廠類的具體的實現,需要額外添加代碼。
- 前言
- 前言(目錄、源碼、資料)
- (一)簡單工廠模式(SimpleFatory)
- (二)工廠方法模式(FactoryMethod)
- (三)抽象工廠模式(AbstractFactory)
- (四)創建者模式(Builder)
- (五)原型模式(Prototype)
- (六)單例模式(Singleton)
- (七)外觀模式(Facade)
- (八)適配器模式(Adapter)
- (九)代理模式(Proxy)
- (十)裝飾模式(Decorator)
- (十一)橋模式(birdge)
- (十二)組合模式(Composite)
- (十三)享元模式(Flyweight)
- (十四)模板方法模式(Template)
- (十五)觀察者模式(Observer)
- (十六)狀態模式(State)