前言
FactoryMethod模式目是一种生成实例的规范。该模式构建一个生成实例的工厂,父类工厂决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类工厂。目的是将生成实例的框架(framework)和实际负责生成实例的类解耦。
实现
类结构:
产品父类,定义了产品是任意可以use的东西:
工厂父类,定义了生产产品的方式,即先创建,再注册:
IDCard类,是一个具体的产品子类:
IDCardFactory,是一个专门生产IDCard的工厂子类:
使用:
登场角色
FactoryMethod模式中的角色有四个,分为两方。
Product(产品)
属于“框架”这一方,是一个抽象类,定义了在Factory Method模式中生成的实例所必须持有的接口,但具体的处理由子类Concrete Product角色决定。代码中Product类扮演此角色。
Creator(创建者)
属于“框架”这一方,是负责创建Product角色的抽象类,但具体的处理由子类ConcreteCreator角色决定。代码中由Factory类扮演此角色。
Creator角色对具体负责生产实例的角色和具体的产品角色一无所知,它唯一知道的是只要调用创建实例的方法,就能生成Product角色的实例。不用new关键字生成实例,而是调用方法生成实例,这样做可以防止父类和其他具体类耦合。
Concrete Product(具体的产品)
属于“具体加工”这一方,它决定了具体的产品。代码中由IDCard类扮演此角色。
Concrete Creator(具体的创建者)
属于“具体加工”这一方,负责创建具体的产品,代码中由IDCardFactory类扮演此角色。
分析
如果我们想用相同的框架创建电视机实例,只需要在television包中编写Televison类和TelevisionFactory类即可,不需要修改framework包中的任何内容,即framework包不依赖于television包。
总结
在“如何生成实例”这一方面,FactoryMethod模式提供了生成实例的“框架”和“具体加工”,用工厂去生产产品。如果想用相同的框架得到其他的产品和工厂,那么只需要添加“具体加工”,而无需对“框架”做任何改动,从而降低了代码耦合。