定义
定义一个用于创建对象的接口,让子类去决定实例化哪个类
使用场景
在任何需要生成复杂的对象的地方我们都可以使用工厂模式。复杂对象适合工厂模式,如果是直接new操作就可以创建的对象就无需使用了
UML图
图1表示的是简单工厂模式,我们没有创建抽象工厂类,因为有时候我们只需要一个工厂。但是如果有时候我们需要多个工厂来生成不同的产品就会使用到图2。
示例
抽象产品类:
public abstract class Product {
/**
* 产品类的抽象方法
* 具体的产品类实现具体的方法
*/
public abstract void method();
}
具体产品类A:
public class ConcreteProductA extends Product{
/**
* 实现产品类的抽象方法
*/
@Override
public void method() {
System.out.println("这是具体的产品A");
}
//产品A的其他方法...
public void ProductA(){
}
}
具体产品类B:
public class ConcreteProductB extends Product{
/**
* 实现产品类的抽象方法
*/
@Override
public void method() {
System.out.println("这是具体的产品B");
}
//产品B的其他方法...
public void ProductB(){
}
}
抽象工厂类:
public abstract class Factory {
/**
* 抽象工厂方法
* 具体实现由子类实现
* @return 具体的产品对象
*/
public abstract Product createProduct();
}
具体工厂类A:
public class ConcreteFactoryA extends Factory{
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
具体工厂类B:
public class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
客户类:
public class Client {
public static void main(String[] args) {
Factory factoryA=new ConcreteFactoryA();
Product productA=factoryA.createProduct();
productA.method();
Factory factoryB=new ConcreteFactoryB();
Product productB=factoryB.createProduct();
productB.method();
}
}
上面示例的几个角色都很简单,只有分为四大模块:
一是抽象工厂,为工厂模式的核心;
二是具体工厂,实现了具体的工厂业务逻辑;
三是抽象产品,是工厂模式所创建的产品的父类;
四是具体产品,实现抽象产品的某个具体产品的对象;
在Client类中我们分别创建不同的具体工厂类,并且通过具体工厂类的对象生成了具体的产品对象。这种需要哪个产品就生产哪一个比较常见,我在书上还看到有利用反射的方式来更加简洁的生成具体的产品对象。