這些天趁着有時間在看android的設計模式,感受頗深啊,我等下的代碼和大神沒啥卻別,大神之所以牛逼是因爲能在合適的場景下使用合適的設計模式從而設計出完美的代碼結構,路漫漫其修遠兮,吾將上下而求索,來先看圖:
錯了錯了,不是這張圖(上錯了):
工廠方法模式的核心就在於2個接口(或抽象類),請看上圖,一個是Product抽象類,他就表示我們需要的實例的抽象,另一個就是FathorFactory工廠的抽象類,工廠有很多種,生產毛衣的,生產大炮的,等等,通過工廠我們可以獲取東西,也就是我們需要的類的實例,你可以有一個工廠,也可以寫多個工廠(這樣的話職責專業),只要你喜歡就好。下面就是Product和Factory的接口代碼:
public abstract class Product {
//所有實例的共性
public String shape;
public String color;
public String size;
//抽象方法
public abstract void function();
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getShape() {
return shape;
}
public void setShape(String shape) {
this.shape = shape;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
@Override
public String toString() {
return "Product{" +
"color='" + color + '\'' +
", shape='" + shape + '\'' +
", size='" + size + '\'' +
'}';
}
}
public abstract class FathorFactory {
//負責獲取實例
public abstract Product getProduct();
}
2 下面是他們的實現類
public class SubProduct extends Product {
@Override
public void function() {
System.out.println("SubProduct.function= function");
}
}
工廠的實例
public class ConcreteFactory extends FathorFactory {
//工廠就是生產東西的,這裏也是一樣,負責生產我們需要的Product的實例
@Override
public Product getProduct() {
SubProduct product = new SubProduct();
product.setShape("圓");
product.setColor("red");
product.setSize("12");
return product;
}
}
3 activity中調用
ConcreteFactory concreteFactory = new ConcreteFactory();
Product product = concreteFactory.getProduct();
System.out.println("MainActivity.getFact=" + product.toString());
結果:
MainActivity.getFact=Product{color='red', shape='圓', size='12'}
優點:如果後面我們要增加Product的類型,這時候就只要寫一個類繼承Product接口就可以了。
最後再優化一下實體工廠的代碼:
//通過反射使這個工廠變爲通用工廠
public class ConcreteFactory extends FathorFactory {
@Override
public <T extends Product> T getProduct(Class<T> obj) {
try {
return (T) Class.forName(obj.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
結果:
ConcreteFactory concreteFactory = new ConcreteFactory();
SubProduct product = concreteFactory.getProduct(SubProduct.class);
System.out.println("MainActivity.getFact=" + product.toString());