Gof23种设计模式(1)——工厂方法模式(Factory Method)

2020年8月6日13:03:52 评论 77

1 基础知识

1.1 标准定义

工厂方法(Factory Method)模式标准定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

1.2 分析和说明

工厂方法(Factory Method)模式是一个创建性的模式。它要求工厂类和产品类分开。由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例,但这些不同的实例有共同的父类。Factory Method把创建这些实例的具体过程封装起来了。当一个类无法预料将要创建哪种类的对象或是一个类需要由子类来指定创建的对象时,我们就需要用到Factory Method模式了。

Gof23种设计模式(1)——工厂方法模式(Factory Method)

图1 工厂模式结构

工厂(Factory Method)模式结构如图1所示说明。工厂模式涉及到抽象工厂角色、具体工厂角色、抽象产品角色以及具体产品角色等。

抽象工厂(Creator)角色:任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类或接口实现。

具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在实际的系统中这个角色使用具体类实现。

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类或者接口来实现。

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。这个角色使用具体类来实现。

2 应用场景举例

比如某一类公司能提供一种产品,但是这种产品有不同的型号。当客户需要一种产品,但是没有具体是哪一种型号,只是提供了一些产品参数,公司就根据这些参数来提供产品。这就是工厂模式。用例如图2。

Gof23种设计模式(1)——工厂方法模式(Factory Method)

图2 工厂模式的用例图

在这里可以把公司(Company)理解为抽象工厂角色。CompanyA是具体工厂(Concrete Creator)角色。Product是抽象产品(Product)角色。ProductA和ProductB是具体产品(Concrete Product)角色。其实现类图如图3所示。

Gof23种设计模式(1)——工厂方法模式(Factory Method)

图3 工厂模式的类图

工厂模式实现的顺序图见图4。实现顺序描述:
①客户首先创建一个具体公司;
②客户向公司申请一个产品并传入产品参数。
③具体公司按照客户要求新建一个产品;
④具体公司把产品返回给客户。
⑤客户调用产品方法。

Gof23种设计模式(1)——工厂方法模式(Factory Method)

图4 工厂模式实现顺序图

3.Java的程序实现代码

Java程序实现主要包括Company接口文件,Product接口文件,CompanyA类文件,ProductA和ProductB类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。

Company接口为(Creator)角色,Company接口的程序代码清单01所示。

程序代码清单01

public interface Company {
    public Product bulidProduct(String Parameter);
}

Product接口为抽象产品(Product)角色,Product接口的程序代码清单02所示。

程序代码清单02

public interface Product {
    public String productType = null;
    public String getProductType ();
    public void doUse();
}

CompanyA类为具体工厂(Concrete Creator)角色,CompanyA类文件程序代码清单03所示。

程序代码清单03

public class CompanyA implements Company{

    public Product bulidProduct(String Parameter){
        if (Parameter.equals("A")) {
             return new ProductA();
        } else if (Parameter.equals("B")) {
             return new ProductB();
        } else {
             return null;
        }
    }
}

ProductA类和ProductB类为具体产品(Concrete Product)角色,ProductA和ProductB类文件程序代码清单04所示。

程序代码清单04

public class ProductA implements Product{

    public String productType = "ProductA";
    private String productParameter = "A";

    public String getProductType(){
        return productType;
    }

    public String getParameter(){ 
        return productParameter;
    }

    public void doUse(){
        System.out.println("这是ProductA实现的功能");
    }
}

public class ProductB implements Product{

    public String productType = "ProductB";

    private String productParameter = "B";

    public String getProductType() {
        return productType;
    }

    public String getParameter() { 
        return productParameter;
    }

    public void doUse(){
        System.out.println("这是ProductB实现的功能");
    }

}

工厂模式测试程序的代码清单05所示。其实现的序列图如图4所示。

代码清单05

public class Client {

    public static void main(String[] args) {

        Company company = new CompanyA();

        //根据传入的参数得到ProductA产品
        Product product = company.bulidProduct("A");
        product.doUse();

        //根据传入的参数得到ProductB产品
        product = company.bulidProduct("B");
        product.doUse();
    }
}

工厂模式测试类输出结果如下所示:

这是ProductA实现的功能
这是ProductB实现的功能

 

4 扩展和说明

工厂模式是应用最广的设计模式之一。

有些书籍中提出了简单工厂模式。简单工厂模式实际上就是把抽象工厂改为了静态工厂,具体产品由静态工厂创建出来。这其实是一种工厂模式的变种。


参考链接

5种创建型模式:

Gof23种设计模式(1)——工厂模式(Factory Method)
Gof23种设计模式(2)——抽象工厂模式(Abstract Factory)
Gof23种设计模式(3)——建造模式(Builder)
Gof23种设计模式(4)——原型模式(Prototype)
Gof23种设计模式(5)——单例模式(Singleton)
Gof23种设计模式 —— 创建型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月6日13:03:52
  • 转载请注明:https://www.suketech.com/8791.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: