工厂方法顾名思义,即是创建实例的方法。简单工厂方法又称为静态工厂,因为创建实例的逻辑都封装在工厂方法内部,往往这个方法是静态的,方便Client端调用 。
代码如下:
商品的抽象接口,内部有个生产商品的方法Produce
public interface Product {
void produce();
}
具体的商品A and B, 都实现同一抽象接口Product
public class ProductA implements Product {
@Override
public void produce() {
System.out.println("Produce Product A");
}
}
public class ProductB implements Product {
@Override
public void produce() {
System.out.println("Produce Product B");
}
}
静态工厂方法
public class SimpleFactory {
public static Product getProduct(String flag) {
Product product = null;
if ("A".equals(flag)) {
product = new ProductA();
} else if ("B".equals(flag)) {
product = new ProductB();
} else {
System.out.println("Not exist such Product");
}
return product;
}
}
客户端调用
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Product product = SimpleFactory.getProduct("A");
product.produce();
}
}
上面的代码基本就是一个简单工厂模式的实现,容易看出创建对象的逻辑都在工厂类的静态方法中,所以这个工厂就承担了很重要的一个责任。
如果这个时候业务有所变更,新增ProductC和ProductD两个商品,我们只要新建两个对应的类来实现Product这个接口并实现Produce方法。但是这里就要涉及到静态工厂方法的逻辑修改,增加if else的判断。这样就违背了开闭原则,即对扩展开放,对修改关闭。