工厂方法模式(Factory Patern),是创建型设计模式之一。工厂方法模式是一种结构简单的模式;
定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景:
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
UML类图:
示例:
public abstract class Product {
/**
* 产品类的抽象方法
* 由具体的产品类去实现
*/
public abstract void method();
}
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("具体的产品A");
}
}
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("具体的产品B");
}
}
public abstract class Factory {
/**
* 抽象工厂方法
* 具体生产什么由子类去实现
* @return 具体的产品对象
*/
public abstract Product createProduct(); //方式一
/**
*
* @param cls 产品对象类类型
* @return 具体的产品对象
*/
public abstract <T extends Product> T createProduct(Class<T> cls); //方式二
}
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() { //方式一
return new ConcreteProductA() ;
}
@Override
public <T extends Product> T createProduct(Class<T> cls) { //方式二
Product p = null;
try{
p = (Product) Class.forName(cls.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return (T) p;
}
}
public class Main {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product p = factory.createProduct();
p.method();
}
}
示例中主要分为四大模块,一是抽象工厂,其为工厂方法模式的核心;二是具体工厂,其实现了具体的业务逻辑;三是抽象产品,是工厂方法模式所创建的产品的父类;四是
具体产品,为实现抽象产品的某个具体产品的对象。
示例中Factory包含一个利用反射的方式实现的工厂方法方式,此时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类。这种方法比较简洁、动态、如
果不喜欢这种方式,也可以尝试为每一个产品都定义一个具体的工厂。
当我们的工厂只有一个的时候,,那么可以简化掉抽象类是没问题的,只需要将对应的工厂方法改为静态方法即可。
public static Product createProduct1(){
return new ConcreteProductB();
}public static Product createProduct1(){
return new ConcreteProductB();
}
这种方式又称为简单工厂或静态工厂,它是工厂方法模式的一个弱化版本。
总结:
工厂方法模式是一个很好的设计模式,是完全符合设计原则的,其降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,
有非常好的扩展性。
缺点:每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要权衡利弊了。