一:工厂方法模式(Factory Method Pattern)
工厂方法模式是简单工厂模式的衍生,它对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类或者接口,一般为接口),这个类将不再负责具体产品的生产,而是只制定生产规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式的意义在于定义了一个创建产品对象的工厂接口,将实际的创建工作推迟到子类当中。使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。实现‘开-闭 原则’的同时,实现了可扩展,可以应用于产品结构复杂的场合。
工厂方法模式角色与结构:
抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
具体工厂和抽象工厂之间是继承关系。
抽象产品:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
具体产品和抽象产品之间也是继承关系。工厂和产品之间是依赖关系。抽象工厂依赖于抽象产品,具体工厂依赖于具体产品。
工厂方法模式的一个示例UML图:
二、抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类的设计模式。
在这种设计模式中当每个抽象产品都有多于一个的具体子类的时候,抽象工厂模式将提供多个具体工厂角色,分别对应于多个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
抽象工厂模式的一个示例UML图:
三、工厂方法模式和抽象工厂模式的区别:
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
工厂方法模式是简单工厂模式的衍生,它对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类或者接口,一般为接口),这个类将不再负责具体产品的生产,而是只制定生产规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式的意义在于定义了一个创建产品对象的工厂接口,将实际的创建工作推迟到子类当中。使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。实现‘开-闭 原则’的同时,实现了可扩展,可以应用于产品结构复杂的场合。
工厂方法模式角色与结构:
抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
具体工厂和抽象工厂之间是继承关系。
抽象产品:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
具体产品和抽象产品之间也是继承关系。工厂和产品之间是依赖关系。抽象工厂依赖于抽象产品,具体工厂依赖于具体产品。
工厂方法模式的一个示例UML图:
抽象工厂模式是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类的设计模式。
在这种设计模式中当每个抽象产品都有多于一个的具体子类的时候,抽象工厂模式将提供多个具体工厂角色,分别对应于多个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
抽象工厂模式的一个示例UML图:
三、工厂方法模式和抽象工厂模式的区别:
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。