定义
工厂方法模式(Factory Method Pattern)又叫作多态性工厂模式,指定义一个创建对象的接口,但由实现这个接口的类来决定实例化哪个类,工厂方法把类的实例化推迟到子类中进行。也就是说,工厂方法模式中,不在由工厂类生产对应的产品,而是由工厂类的子类实现具体产品的生产逻辑,解决简单工厂中switch case的臃肿,也符合开闭原则
模式结构
(1) 抽象工厂(Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
(2)具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
(3)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
(4)具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
适用场景
(1)一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
(2)一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,从而使得系统更容易扩展。
代码实现
1.抽象工厂类:
public interface IFactory
{
public IProduct makeProduct();
}
2.具体工厂类:
public class FactoryA implements IFactory{
@Override
public IProduct makeProduct() {
System.out.println("具体工厂A生成具体产品A");
return new ProductA();
}
}
public class FactoryB implements IFactory{
@Override
public IProduct makeProduct() {
System.out.println("具体工厂B生成具体产品B");
return new ProductB();
}
}
3.抽象产品
public interface IProduct {
public void doSomething();
}
4.具体产品
public class ProductA implements IProduct {
@Override
public void doSomething() {
System.out.println("具体产品A显示...");
}
}
public class ProductB implements IProduct {
@Override
public void doSomething() {
System.out.println("具体产品B显示...");
}
}
测试结果:
public class AbstractFactoryTest {
public static void main(String[] args) {
IFactory factoryA = new FactoryA();
IProduct productA = factoryA.makeProduct();
productA.doSomething();
IFactory factoryB = new FactoryB();
IProduct productB = factoryB.makeProduct();
productB.doSomething();
}
}
控制台输出结果:
具体工厂A生成具体产品A
具体产品A显示...
具体工厂B生成具体产品B
具体产品B显示...