一、简介
- 工厂方法模式场景
- 客户端不知道它所需要的对象的类,在工厂方法模式中,客户端不需要具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建,可见具体产品类的类名在配置文件或者数据库中存在!
- 抽象工厂类通过其子类来指定创建那个产品类,用父类来新建子类可以提高可扩展性。
- 优点
- 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户端隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需要产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
- 基于工厂角色和产品角色的多态性设计是工厂方法的关键,他能够让工厂模式自主的创建产品对象,而如何创建这个对象的细节完全封装在工厂类。
- 使用工厂方法模式最大的优点就是你新加类的时候不用动源代码,只要写新的产品新的工厂来继承对应的类就行了。
- 缺点
- 既是优点又是缺点,你要新加类型的时候,既要创建产品类,又要创建工厂类,增加了一大波类。在一定的程度上增加系统的复杂度。
- 由于考虑到系统的可在性,需要引入抽象层,在客户·端代码中均用抽象定义,更加难以理解。
二、代码
public interface Factory{
public Product factoryMethod();
}
以上为抽象工厂类
public class ConcreteFactory implements Factory{
public Product facotryMethod(){
return new ConcreteProduct();
}
}
以上为具体的工厂类
三、举例
首先创建抽象工厂
public interface Factory{
public Product create();
}
再创建具体工厂A
public class AFactory implements Factory{
@Override
public Product create() {
return new AProduct();
}
}
具体工厂B
public class BFactory implements Factory{
@Override
public Product create() {
return new BProduct();
}
}
创建抽象产品接口
public interface Product{
public void produce();
}
具体的产品A
public class AProduct implements Product{
public void produce() {
System.out.println("Produce A!");
}
}
具体的产品B
public class BProduct implements Product{
public void produce() {
System.out.println("Produce B!");
}
}
用户端调用
public class Client {
public static void main(String[] args) {
Factory factory;
Product product;
factory = new AFactory();
product = factory.create();
product.produce();
factory = new BFactory();
product = factory.create();
product.produce();
}
}
输出:
Produce A!
Produce B!