一:工厂方法模式
1.概念
工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
模式结构:
抽象工厂(ExportFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类 实现。
具体工厂(ExportHtmlFactory、ExportPdfFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者 的调用以创建导出类(如:ExportStandardHtmlFile)。
抽象导出(ExportFile)角色:工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中, 这个角色也常常使用抽象类实现。
具体导出(ExportStandardHtmlFile等)角色:这个角色实现了抽象导出(ExportFile)角色所声明的接口,工厂方法模式所创建的每一
个对象都是某个具体导出角色的实例。
二:模式案例
package com.cloud.factory2;
public class MainTest {
public static void main(String[] args) {
FruitGardener fg=new AppleGardener();
fg.factory().harvest();
}
}
//水果园林
interface FruitGardener{
public Fruit factory();
}
//Apple园林
class AppleGardener implements FruitGardener{
public Fruit factory() {
return new Apple();
}
}
//StrawBerray园林
class StrawBerrayGardener implements FruitGardener{
public Fruit factory() {
return new Strawberray();
}
}
//Grape园林
class GrapeGardener implements FruitGardener{
public Fruit factory() {
return new Grape();
}
}
interface Fruit{
void plant();
void grow();
void harvest();
}
//Apple类
class Apple implements Fruit{
private int treeAge;
public void plant() {
log("种植苹果");
}
public void grow() {
log("苹果生长");
}
public void harvest() {
log("收获苹果");
}
public static void log(String msg){
System.out.println(msg);
}
public int getTreeAge() {
return treeAge;
}
public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}
}
//Grape类
class Grape implements Fruit{
//区分葡萄是否有籽
private boolean sendless;
public void plant() {
log("种植葡萄");
}
public void grow() {
log("葡萄生长");
}
public void harvest() {
log("收获葡萄");
}
public static void log(String msg){
System.out.println(msg);
}
public boolean isSendless() {
return sendless;
}
public void setSendless(boolean sendless) {
this.sendless = sendless;
}
}
//Strawberray类
class Strawberray implements Fruit{
public void plant() {
log("种植草莓");
}
public void grow() {
log("草莓生长");
}
public void harvest() {
log("收获草莓");
}
public static void log(String msg){
System.out.println(msg);
}
}
三:工厂方法模式和简单工厂模式 工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。 工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。 如果系统需要加入一个新的导出类型,那么所需要的就是向系统中加入一个这个导出类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。