介绍
工厂方法模式,通过把工厂抽象为一个接口,这样当我们新增具体产品的时候,就只需要实现一个新的具体工厂类即可。一个具体工厂类,对应着一个产品。
请注意:在工厂方法模式中,一个具体工厂类只对应生产一个产品。(这是扩展产品的关键)
工厂方法模式与简单工厂模式的区别就是,不直接使用具体的工厂类,而是使用一个共同的工厂接口,于是把创建产品的任务延迟到子类进行,这样做的好处是,当我们需要增加新产品时,不需要直接去工厂类修改代码,只需新增一个工厂子类即可。
程序员只需要关注去使用哪一个具体工厂类即可。
演示一个例子:
假设现在只有一个产品table,我们希望再添加一个产品chair
那我们可以画出以下的uml图
我们还有一个客户端需要耦合与工厂对象,那么,我们其实也可以将客户端变成与配置文件的弱耦合,通过配置文件来决定去创建哪个工厂类
创建产品接口
public interface Product {
//返回产品的信息
String getDate();
}
创建具体产品
public class Table implements Product{
private String name;
public Table(String name) {
this.name = name;
}
@Override
public String getDate() {
return "产品信息:"+name;
}
}
public class Chair implements Product{
private String name;
public Chair(String name) {
this.name = name;
}
@Override
public String getDate() {
return "产品信息:"+name;
}
}
创建工厂接口
public interface Factory {
//生产产品
Product create();
}
创建工厂的具体实现类:
TableFactory,ChairFactory
public class TableFactory implements Factory{
@Override
public Product create() {
return new Table("桌子");
}
}
public class ChairFactory implements Factory{
@Override
public Product create() {
return new Chair("椅子");
}
}
创建测试的客户端
我们用客户端中的步骤来模拟上面的场景
public class Client {
public static void main(String[] args) {
//创建工厂类
Factory factoryA=new TableFactory();
//使用工厂类创建产品
Product tableProduct = factoryA.create();
//第一个产品的信息
System.out.println(tableProduct.getDate());
//新增了产品chair以后,创建该产品
Factory factoryB=new ChairFactory();
Product chairProduct = factoryB.create();
System.out.println(chairProduct.getDate());
}
}
运行结果: