在代码中我们可以去new各种各样的对象, 比如说可以 new 大象(),new 老虎(),new 飞机() 这些,但是在使用过程中直接去new出来并不规范,我们需要更规范的调用模式,于是就会用到工厂模式.
工厂模式的uml图:
具体代码实现:
public interface Factory {
Product createProduct();
}
public interface Product {
void method();
}
public class ConcreteFactory implements Factory{
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteProductA implements Product{
@Override
public void method() {
System.out.println("我是具体的产品A");
}
}
public class ConcreteProductB implements Product{
@Override
public void method() {
System.out.println("我是具体的产品B");
}
}
最后调用
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
我们也可以利用反射实现一个更简洁的调用
public interface Factory {
<T extends Product> T createProduct(Class<T> clz);
}
public class ConcreteFactory implements Factory{
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try{
p = (Product)Class.forName(clz.getName()).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T)p;
}
}
最后调用
ConcreteFactory concreteFactory = new ConcreteFactory();
ConcreteProductA concreteProductA = concreteFactory.createProduct(ConcreteProductA.class);
concreteProductA.method();
可以看出来工厂方法使得同一类产品的实例化更加清晰,文章开始提到的new 大象(),new 老虎()其实都是属于同类,我们完全可以抽象出一个Animal的接口,然后使用工厂模式去实例化这种类型的对象.