设计模式-创建型-工厂方法(Factory Method)

  创建型-工厂方法

  前面已经写过抽象工厂。其实工厂方法应该放在抽象方法前面,抽象工厂中,大工厂可以生产多个产品。而在工厂方法个,每个工厂生产一个产品。

  假设我们定义用于导出的文件对象的接口(工厂生产的产品类型)

  ExportFileApi.java

public interface ExportFileApi {
    public void export();
}

  导出文件中,可以导出数据到文本文件,也可以导出数据到数据库。

  接口ExportFileApi的实现

  ExportTxtFile.java

public class ExportTxtFile implements ExportFileApi {
    @Override
    public void export() {
        System.out.println("导出数据到文本文件");
    }
}

  ExportDB.java

public class ExportDB implements ExportFileApi {
    @Override
    public void export() {
        System.out.println("导出数据到数据库备份文件");
    }
}

  产品已经有了,现在我们需要设计我们的工厂了。

  每个工厂生产一个产品。有多个产品,则需要多个工厂。现在定义一个工厂接口。

  ExportOperate.java

public interface ExportOperate {
    public  ExportFileApi factoryMethod();
}

 

  创建具体的工厂:

  ExportDBOperate.java

public class ExportDBOperate implements ExportOperate {
    @Override
    public ExportFileApi factoryMethod() {
        return new ExportDB();
    }
}

  ExportTxtFileOperate.java

public class ExportTxtFileOperate implements ExportOperate {
    @Override
    public ExportFileApi factoryMethod() {
        return new ExportTxtFile();
    }
}

   好了,写到这里,工厂方法已经写完了。看到没有,其实抽象工厂就是在这个的基础之上,工厂可以生产多次产品。

  使用工厂。

  FactoryMethodTest.java

public class FactoryMethodTest {
    public static void main(String[] args) {
        //创建工厂
        ExportOperate operate = new ExportTxtFileOperate();
        //创建产品
        ExportFileApi xportFileApi = operate.factoryMethod();
        xportFileApi.export();
    }
}

  运行结果:

导出数据到文本文件

 

  缺点: 

    工厂与具体产品耦合太高,要是需要新的产品,就需要新的工厂,容易导致工厂泛滥。

 

  扩展:

    spring提供了一种解决工厂泛滥的方式:BeanFactory。这是我们不需要产生多个工厂,只有一个工厂,工厂可以产生各种实例。但不是说Spring的BeanFactory就是比工厂方法好,需要看具体使用。

posted on 2019-06-04 20:43  xingshouzhan  阅读(129)  评论(0编辑  收藏  举报

导航