工厂方法模式的定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。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");
}
}