设计模式(五)_工厂方法模式

简介: 今天主要讲解的是工厂方法模式。内容参考自java_my_life 博主的博客。但是拒绝粘贴复制,全部手打工厂方法模式是类的创建模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作,推迟到子类中。

今天主要讲解的是工厂方法模式。内容参考自java_my_life 博主的博客。但是拒绝粘贴复制,全部手打

工厂方法模式是类的创建模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作,推迟到子类中。

案例说明

大家很多时候都做过导出功能,比如一个系统,需要导出的格式包括html、pdf等。但是财务系统导出的格式和其他普通的格式又不一样,

此时如果用我们上篇学到的简单工厂模式,势必会让工厂类很繁琐,各种if判断。日后增加导出的格式,又会对工厂类进行增加逻辑编写。 此时我们采用 工厂方法模式进行实现。核心的工厂类不再负责所有对象的创建,它只是声明看一个工厂接口,具体的对象创建交给了子类。

下面针对这个程序,我画的uml图

enter image description here

从上图可以看出,一共有4个角色

  • 抽象工厂角色:担任这个角色的工厂方法模式的核心,在模式中创建对象的工厂类必须实现该接口。
  • 具体工厂角色:实现 抽象工厂接口的具体类,与业务逻辑密不可分。
  • 抽象导出角色:工厂方法模式所创建的对象的父类,也就是所有导出类的父类。
  • 具体导出角色:这个角色实现了抽象导出角色的接口。

    具体代码

1.抽象导出角色

public interface ExportFile {

    public boolean export(String data);
}

2.具体导出角色

public class ExportFinancialHtmlFile implements ExportFile {
    @Override
    public boolean export(String data) {

        System.out.println("导出财务版HTML文件");
        return true;
    }
}

public class ExportFinancialPdfFile implements ExportFile {
    @Override
    public boolean export(String data) {
        System.out.println("导出财务版PDF文件");
        return true;
    }
}

public class ExportStandardHtmlFile implements ExportFile {
    @Override
    public boolean export(String data) {
        System.out.println("导出标准版HTML文件");
        return true;
    }
}

public class ExportStandardPdfFile implements ExportFile {
    @Override
    public boolean export(String data) {
        System.out.println("导出财务版PDF文件");
        return true;
    }
}

3.抽象工厂角色

public interface ExportFactory {

    public ExportFile factory(String type);
}
  1. 具体工厂角色
public class ExportHtmlFactory implements ExportFactory {
    @Override
    public ExportFile factory(String type) {
        if("standard".equals(type)){

            return new ExportStandardHtmlFile();
        }else if("financial".equals(type)){

            return new ExportFinancialHtmlFile();
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }
}

public class ExportPdfFactory implements ExportFactory {
    @Override
    public ExportFile factory(String type) {
        if("standard".equals(type)){

            return new ExportStandardPdfFile();
        }else if("financial".equals(type)){

            return new ExportFinancialPdfFile();
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }
}

测试

    public static void main(String[] args) {
        String data = "";

        ExportFactory exportFactory = new ExportHtmlFactory();

        ExportFile exportFile = exportFactory.factory("financial");

        exportFile.export(data);
    }

执行结果

导出财务版HTML文件

总结

  • 工厂方法模式和简单工厂模式明显的不同在结构上,工厂方法的核心是抽象工厂类,简单工厂模式的核心是一个具体的类
  • 如果系统新增一个导出类型,此时只需要增加一个导出类和对应的工厂类,客户端不需要改动,更符合开闭原则。

需要注意一点,设计模式是一种设计思想,并不是一成不变的 ,不要为了套设计思想让代码变得复杂,反而是一种画蛇添足的做法。

所有设计模式的代码已经放到github上。

学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。
相关文章
|
6天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 构造函数模式
js设计模式【详解】—— 构造函数模式
15 6
|
11天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
11天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
14 2
|
12天前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式
9 1
|
17天前
|
设计模式 Java 数据库连接
Java设计模式之工厂方法模式详解
Java设计模式之工厂方法模式详解
|
17天前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
29天前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
39 6
|
29天前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
23 5
|
29天前
|
设计模式 Java 关系型数据库
设计模式第2弹:工厂方法模式
type ComputerProduct struct{} // 实现工厂方法 func (computer ComputerProduct) GetInformation() string { return "电脑,官方称呼计算机,主要用于进行数据运算的一台机器。" }
29 4
|
11天前
|
设计模式 安全 Java
设计模式学习心得之五种创建者模式(1)
设计模式学习心得之五种创建者模式(1)
9 0