設計模式:給你生產一個女朋友---工廠方法模式

weixin_33762321發表於2017-10-08

工廠方法模式

工廠方法模式是我們開發中使用最廣泛的設計模式之一,不說無聊的定義,直接看例子

一、工廠方法模式的四大模組:

1、抽象工廠 --- 一個抽象類,有一個生產產品(女朋友)的抽象方法,由具體工廠實現。

2、具體工廠 --- 繼承抽象工廠類,生產何種產品(你是要國產還是要日韓還是要歐美由你定)的具體實現。

3、抽象產品 --- 一個抽象類,提供一個抽象方法,由具體產品實現。

4、具體產品 -- 哈哈,你懂的。

以上解釋看不懂?沒關係,看程式碼:

二、工廠方法模式的通用程式碼

1、抽象工廠類

//抽象工廠
public abstract class Factory {
    public abstract Product createProduct();
}    複製程式碼

2、具體工廠

public class ProductFactory extends Factory {

    @Override
    public Product createProduct() {

        return new GirlFriendProduct();
        //return new BoyFriendProduct();
    }
}複製程式碼

3、抽象產品

public abstract class Product {
    public abstract void createProduct();
 }複製程式碼

4、具體的產品

 //生產女朋友
 public class GirlFriendProduct extends Product {

    @Override
    public void createProduct() {

        System.out.println("product======冰冰");
    }
}    

//生產男朋友
public class BoyFriendProduct extends Product{

    @Override
    public void createProduct() {
        System.out.println("product======小鮮肉");
    }
} 複製程式碼

接下來看看在程式碼中的使用

 public class FactoryActivity extends AppCompatActivity {

    private Product mProduct;
    private Factory mFactory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_factory);

        mFactory = new ProductFactory();
        mProduct = mFactory.createProduct();

    }

    //生產一個朋友
    public void clickCreate(View view) {
        mProduct.createProduct();
    }
}複製程式碼

點選按鈕,生產一個朋友,看看控制檯日誌輸出:

 product======冰冰複製程式碼

好了,到此為止,一個通用的工廠方法模式的程式碼就寫完了。不過可能有人說了,老子喜歡男的啊,這也好辦啊,你在ProductFactory類裡,返回 BoyFriendProduct 就行了(參見注釋掉的程式碼),這時你再生產一個朋友看看,控制檯輸出如下:

 product======小鮮肉複製程式碼

好了,大胸弟,你要的小鮮肉也有了,盡情的去玩耍吧。

這時比較常見的方式,你需要女朋友就生產女朋友,反之你就生產男朋友,其實還可以通過泛型來簡化一下程式碼,改造後的程式碼如下:

 //抽象工廠 具體生產什麼產品由子類實現
public abstract class Factory {
       public abstract <T extends Product> T createProduct(Class<T> clz);
} 複製程式碼

具體工廠:

 //具體工廠
 public class ProductFactory extends Factory {

@Override
public <T extends Product> T createProduct(Class<T> clz) {
    Product product = null;
    try {
        product = (Product) Class.forName(clz.getName()).newInstance();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return (T) product;
}
}複製程式碼

此時再看看在程式碼中的使用,這時你只需根據你需要的product傳入相應的類就哦了:

mFactory = new ProductFactory();
mProduct = mFactory.createProduct(BoyFriendProduct.class);

mProduct.createProduct();複製程式碼

以上通過泛型和反射簡化了程式碼,不過假如我們的工廠只生產一種產品的時候(比如只生產女朋友),我們還可以再簡化一下程式碼,我們可以把factory改為普通的類(非抽象),然後在factory類裡直接返回產品並把方法改為靜態即可,這樣的方式又稱為簡單工廠模式。

 public static Product createProduct(){
    return new GirlFriendProduct();
}複製程式碼

PS:工廠設計模式是一個很好的設計模式,它的缺點是每當工廠新增一個產品時(比如還能生產蒼老師,哈哈),我們要新編寫一個相應的產品類,在實際的開發中,可以根據實際情況自行選擇吧。

最後,生產女朋友講完了,下一篇會講一下 帶你勾搭妹子的職責連模式,歡迎關注,謝謝。

本篇專案demo地址,歡迎start

https://github.com/lxykad/design_mode複製程式碼

相關文章