参考书——《HeadFirst设计模式》
(提醒:在设计模式中,所谓的“实现一个接口”,并不一定表示“写一个类,并利用implements关键字来实现某个Java接口”。“实现一个接口”泛指:实现某个超类型(可以是类or接口)的某个方法)
工厂方法用来处理对象的创建,并将这样的行为分装在子类中。这样,客户端程序中关于超类的代码就和子类对象创建代码解耦了。
abstract Product factoryMethod (String Type) ;
1.工厂方法是抽象的,所以依赖子类来处理对象的创建。
2.工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。
3.工厂方法将客户和实际创建具体产品的代码分隔开来。
4.工厂方法可能需要(也可能不需要)参数来指定所要的产品。
Factory Method Pattern 通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
正式定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象的创建者类(Creator)提供了一个创建对象的方法接口(也成为“工厂方法”),在抽象的Creator中,任何其他实现的方法,都可能使用到这个工厂方法所生产出来的产品。但只有子类正真实现这个方法并生产产品。
定义中的“决定”,并不是指模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际创建的产品是哪一个,选择了使用了哪个子类,自然就决定了实际创建的产品是哪一个。
Creator这个抽象类实现了所有操纵产品的方法,但不实现工厂方法。
来看下它的组成:
2)具体工厂角色:它含有和具体业务逻辑有关的代码。
当你直接实例化一个对象时,就是在依赖它的具体类。
这里插入些依赖倒置的一些知识 依赖倒置——不能让高层组件依赖低层组件,而且,不管是高层or低层组件,都应该依赖于抽象。所谓高层组件是由其他低层组件定义其行为的类。
======================================================================================================
再补充下简单工厂模式(因为《HeadFirst设计模式》中没有单独来说),又称静态工厂方法模式(Static Factory MethodPattern)。
简单工厂涉及到三个角色:
1. 工厂类角色:往往由一个具体的类实现。里面的工厂方法和上面的抽象工厂角色的工厂方法不同:a.不是抽象的、b.用static修饰 2. 抽象产品角色 3. 具体的产品