定义:为创建一组相关或者是互相以来的对象提供一个接口,而不需要指定他们的具体的类,
使用场景:
在任何需要生成复杂对象的地方,都可以使用工厂方法模式.
应用举例: 不同牌子的汽车工厂生产不同的汽车
类图:
- AbstractFactory,抽象的工厂类
- ConcreteFactory,具体的工厂类
- Product,抽象的产品类
- ConcreteProduct,具体的产品类
关键代码:在一个工厂里聚合多个同类产品。
优点:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
- 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
abstract class AbstractProductA{
public abstract void method();
}
abstract class AbstractProductB{
public abstract void method();
}
class ConcreteProductA1 extends AbstractProductA{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("具体产品A1的制作方法");
}
}
class ConcreteProductA2 extends AbstractProductA{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("具体产品A2的制作方法");
}
}
class ConcreteProductB1 extends AbstractProductB{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("具体产品B1的制作方法");
}
}
class ConcreteProductB2 extends AbstractProductB{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("具体产品B2的制作方法");
}
}
abstract class AbstractFactory{
public abstract AbstractProductA creatAbstractProductA();
public abstract AbstractProductB creatAbstractProductB();
}
class ConcreteFactory1 extends AbstractFactory{
@Override
public AbstractProductA creatAbstractProductA() {
// TODO 自动生成的方法存根
return new ConcreteProductA1();
}
@Override
public AbstractProductB creatAbstractProductB() {
// TODO 自动生成的方法存根
return new ConcreteProductB1();
}
}
class ConcreteFactory2 extends AbstractFactory{
@Override
public AbstractProductA creatAbstractProductA() {
// TODO 自动生成的方法存根
return new ConcreteProductA2();
}
@Override
public AbstractProductB creatAbstractProductB() {
// TODO 自动生成的方法存根
return new ConcreteProductB2();
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
AbstractFactory factory1 = new ConcreteFactory1();
AbstractFactory factory2 = new ConcreteFactory2();
AbstractProductA productA= factory1.creatAbstractProductA();
AbstractProductB productB = factory2.creatAbstractProductB();
productA.method();
productB.method();
}