这些天趁着有时间在看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());