设计模式学习(一)——工厂方法模式【Factory Method Pattern】

时间:2022-10-02 12:04:06

参考书——《HeadFirst设计模式》


(提醒:在设计模式中,所谓的“实现一个接口”,并不一定表示“写一个类,并利用implements关键字来实现某个Java接口”。“实现一个接口”泛指:实现某个超类型(可以是类or接口)的某个方法)


工厂方法用来处理对象的创建,并将这样的行为分装在子类中。这样,客户端程序中关于超类的代码就和子类对象创建代码解耦了。                            

                                                 

              abstract  Product factoryMethod (String Type) ;

              1.工厂方法是抽象的,所以依赖子类来处理对象的创建。

        2.工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。

         3.工厂方法将客户和实际创建具体产品的代码分隔开来。

                           4.工厂方法可能需要(也可能不需要)参数来指定所要的产品


Factory Method Pattern 通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的

正式定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    抽象的创建者类(Creator)提供了一个创建对象的方法接口(也成为“工厂方法”),在抽象的Creator中,任何其他实现的方法,都可能使用到这个工厂方法所生产出来的产品。但只有子类正真实现这个方法并生产产品。

    定义中的“决定”,并不是指模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际创建的产品是哪一个,选择了使用了哪个子类,自然就决定了实际创建的产品是哪一个。

Creator这个抽象类实现了所有操纵产品的方法,但不实现工厂方法。


来看下它的组成:

1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)具体工厂角色:它含有和具体业务逻辑有关的代码。

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。


    当你直接实例化一个对象时,就是在依赖它的具体类。


    这里插入些依赖倒置的一些知识 依赖倒置——不能让高层组件依赖低层组件,而且,不管是高层or低层组件,都应该依赖于抽象。所谓高层组件是由其他低层组件定义其行为的类。


======================================================================================================

再补充下简单工厂模式(因为《HeadFirst设计模式》中没有单独来说),又称静态工厂方法模式(Static Factory MethodPattern)。

简单工厂涉及到三个角色:

1. 工厂类角色:往往由一个具体的类实现。里面的工厂方法和上面的抽象工厂角色的工厂方法不同:a.不是抽象的、b.用static修饰 2. 抽象产品角色 3. 具体的产品