前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一个设计模式:工厂方法模式

一天一个设计模式:工厂方法模式

作者头像
用户1134788
发布2018-12-03 11:36:01
4760
发布2018-12-03 11:36:01
举报

工厂方法模式:

  定义一个生产产品对象的工厂接口,将创建生产产品的工厂的工作交给子类实现。

  随着实际需要的工厂数量增加,简单工厂模式体积会迅速膨胀,代码迅速臃肿严重。   补充:工厂方法模式是针对一类产品的工厂

  所以为了代码的可阅读下与可维护性,也做到不同的业务有一定的隔离,将工厂的功能抽象出来成一个接口。

工厂模式的结构:   抽象工厂角色:    负责定义工厂的各个功能,是个抽象接口,所有的生产工厂都需要实现它。   具体工厂角色:    实现抽象工厂,针对不同的产品进行生产。   抽象产品角色:    是工厂生产的产品的抽象   具体产品角色:    是工厂生产的具体的产品。

实例:

抽象工厂:

代码语言:javascript
复制
public interface ExportFactory {
    public ExportFile factory(String type);
}

具体工厂:

代码语言:javascript
复制
public class ExportHtmlFactory implements ExportFactory{

    @Override
    public ExportFile factory(String type) {
        // TODO Auto-generated method stub
        if("standard".equals(type)){
            
            return new ExportStandardHtmlFile();
            
        }else if("financial".equals(type)){
            
            return new ExportFinancialHtmlFile();
            
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }

}
代码语言:javascript
复制
public class ExportPdfFactory implements ExportFactory {

    @Override
    public ExportFile factory(String type) {
        // TODO Auto-generated method stub
        if("standard".equals(type)){
            
            return new ExportStandardPdfFile();
            
        }else if("financial".equals(type)){
            
            return new ExportFinancialPdfFile();
            
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }

}

抽象产品:

代码语言:javascript
复制
public interface ExportFile {
    public boolean export(String data);
}

具体产品:

代码语言:javascript
复制
public class ExportFinancialHtmlFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出财务版HTML文件");
        return true;
    }

}
代码语言:javascript
复制
public class ExportFinancialPdfFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出财务版PDF文件");
        return true;
    }

}
代码语言:javascript
复制
public class ExportStandardHtmlFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出标准HTML文件");
        return true;
    }

}
代码语言:javascript
复制
public class ExportStandardPdfFile implements ExportFile {

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出标准PDF文件");
        return true;
    }

}

测试代码:

代码语言:javascript
复制
public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String data = "";
        ExportFactory exportFactory = new ExportHtmlFactory();
        ExportFile ef = exportFactory.factory("financial");
        ef.export(data);
    }

}

工厂方法模式与简单工厂模式:

  工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。   工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。

  如果系统需要加入一个新的导出类型,那么所需要的就是向系统中加入一个这个导出类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。

其实是在简单工厂的基础上再进行一层抽象,进行一个维度的解耦与简化。方便后来代码的维护与可阅读性。

参考链接:

https://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html

https://www.cnblogs.com/xrq730/p/4905578.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工厂方法模式:
  • 实例:
  • 工厂方法模式与简单工厂模式:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档