目录
什么是工厂方法模式
定义一个创建对象的接口,由子类根据参数动态创建对应的对象实例。
为什么要用工厂方法模式
想一下,在实际项目需求中,起初我们会告诉只需要实现具体某个几个功能,于是我们为每一个需求创建一个类,并根据条件在代码里new出对应的对象。但是需求总是来的猝不及防,于是我们为了快速应当需求,不得不在业务逻辑代码里写了一堆if else来创建不同的类。
那么工厂方法模式能很好的解决这个问题,具体需要创建哪个对象完全封装在具体工厂类里,只需要告诉工厂类具体的需要创建何种对象,工厂类就能创建返回具体的对象给你。所以说工厂方法模式能提高代码的可维护性,对变化开放,又具有良好的封装性。所以我认为工厂模式是对开闭原则很好的运用。
那么是否工厂方法里是否只是简单的做if else逻辑呢,当然可以这么做,但是依然可以做一些其他的改变。
工厂方法模式组成
抽象产品类
public abstract class Product {
public void foo1(){
}
public abstract void foo2();
}
具体产品类
public class ConcreteProduct1 extends Product {
@Override
public void foo2() {
System.out.println(" product 1 foo2");
}
}
public class ConcreteProduct2 extends Product {
@Override
public void foo2() {
System.out.println(" product 2 foo2");
}
}
抽象工厂类
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteFactory extends Factory {
@Override
@SuppressWarnings("unchecked")
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
}
catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
测试驱动
public class Main {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ConcreteProduct1.class);
product.foo2();
}
}