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