GoF 创建型 工厂方法模式

工厂方法模式的定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。

工厂方法模式的本质

延迟到子类来选择实现。

工厂方法模式的优缺点

优点: 更容易扩展对象的新版本。
缺点: 具体的产品对象和工厂方法是耦合的。

示例1

public interface ExportFileApi {
    boolean export(String data);
}
public class ExportTxt implements ExportFileApi {
    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到txt文件");
        return true;
    }
}
public class ExportDB implements ExportFileApi {
    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到数据库");
        return true;
    }
}
public abstract class ExportOperate {

    public boolean export(String data) {
        ExportFileApi api = factoryMethod();
        return api.export(data);
    }

    /**
     * 钩子方法,由子类去选择创建具体的类
     * @return
     */
    protected abstract ExportFileApi factoryMethod();
}
public class ExportOperateTxt extends ExportOperate {

    @Override
    protected ExportFileApi factoryMethod() {
        return new ExportTxt();
    }
}
public class ExportOperateDB extends ExportOperate {

    @Override
    protected ExportFileApi factoryMethod() {
        return new ExportDB();
    }
}
public class TestClient {
    public static void main(String[] args) {
        ExportOperate operate = new ExportOperateDB();
        operate.export("aaaa");
    }
}

去扩展一个导出xml。

public class ExportXml implements ExportFileApi {

    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到xml");
        return true;
    }
}
public class ExportOperateXml extends ExportOperate {
    @Override
    protected ExportFileApi factoryMethod() {
        return new ExportXml();
    }
}
public class TestClient {
    public static void main(String[] args) {
        ExportOperate operate = new ExportOperateXml();
        operate.export("aaaa");
    }
}

示例2 参数化

public interface ExportFileApi {
    boolean export(String data);
}
public class ExportTxt implements ExportFileApi {
    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到txt文件");
        return true;
    }
}
public class ExportDB implements ExportFileApi {
    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到数据库");
        return true;
    }
}
public class ExportXml implements ExportFileApi {

    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到xml");
        return true;
    }
}
public class ExportOperate {

    public boolean export(int type,String data) {
        ExportFileApi api = factoryMethod(type);
        return api.export(data);
    }

    protected ExportFileApi factoryMethod(int type) {
        ExportFileApi api = null;
        if (1 == type) {
            api = new ExportTxt();
        } else if (2 == type){
            api = new ExportDB();
        } else if (3 == type) {
            api = new ExportXml();
        }
        return api;
    }

}
public class TestClient {
    public static void main(String[] args) {
        ExportOperate op = new ExportOperate();
        op.export(2, "aaa");
    }
}

扩展导出到MySQL

public class ExportDBMySQL implements ExportFileApi {
    @Override
    public boolean export(String data) {
        System.out.println("导出数据:"+data+"到数据库MySQL");
        return true;
    }
}
public class ExportOperate2 extends ExportOperate {

    @Override
    protected ExportFileApi factoryMethod(int type) {
        if (2 == type) {
            return new ExportDBMySQL();
        } else {
            return super.factoryMethod(type);
        }
    }
}
public class TestClient {
    public static void main(String[] args) {
        ExportOperate op = new ExportOperate2();
        op.export(2, "aaa");
    }
}

你可能感兴趣的:(GoF 创建型 工厂方法模式)