简单工厂
简单工厂一般是提供一个类, 专门封装对象的创建的细节, 即提供一个接口, 根据不同输入创建不同的对象, 这样做的好处是, 用户不必关心创建对象的细节, 从而针对接口编程, 而不是针对实现编程. 一个常见的技巧就是静态工厂, 即提供一个静态方法用于创建对象, 这样做的好处是不需要用创建对象的方法来实例化对象, 但缺点就是不能通过集成来改变创建方法的行为.
简单工厂并不是一种设计模式, 反而比较像是一种编程习惯.
工厂方法模式(Factory Method Pattern)
概念
工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把示例话推迟到子类.
适用场景
1. 当客户程序不需要知道要使用对象的创建过程。
2. 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
2. 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
结构
工厂方法模式组成:
抽象工厂角色: 是具体工厂角色必须实现的接口或者必须继承的父类。它实现了所有操纵产品的方法, 但不实现创建产品的工厂方法.
具体工厂角色:它含有和具体业务逻辑有关的代码,只有它知道如何创建相关产品
抽象产品角色:它是具体产品继承的父类或者是实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例
抽象工厂角色: 是具体工厂角色必须实现的接口或者必须继承的父类。它实现了所有操纵产品的方法, 但不实现创建产品的工厂方法.
具体工厂角色:它含有和具体业务逻辑有关的代码,只有它知道如何创建相关产品
抽象产品角色:它是具体产品继承的父类或者是实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例
优缺点
优点
1. 将创建对象的代码集中在一个对象或方法中, 可以避免代码中的重复, 并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖于接口,而不是具体类。即这可以帮助我们针对接口编程而不是针对实现编程。
抽象工厂模式
概念
抽象工厂模式提供一个接口, 用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样一来,客户就从具体产品中被解耦。
适用场景
1. 系统中有多个产品族,而系统一次只可能消费其中一族产品
2. 同属于同一个产品族的产品及其使用
结构
优缺点
优点
抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类型所写的代码中。所以和抽象工厂一样,抽象工厂可以把客户从所使用的具体产品中解耦,另一个优点是可以把一群相关的产品集合起来。
缺点
因为抽象工厂需要大的接口,是被用来创建整个产品家族的,随意如果需要扩展一组产品,比如加入新产品,就需要改变接口。改变接口就意味着必须深入改变每个子类的接口
简单工厂与工厂方法之间的差异
工厂方法的子类看上去的确很像简单工厂。简单工厂把全部的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。简单工厂的做法,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
工厂方法与抽象工厂之间的异同
1.抽象工厂的方法经常以工厂方法的方式实现。抽象工厂的任务是定义一个负责创建一组产品的接口。这个接口内的每个方法都负责创建一个具体产品, 同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以在抽象工厂中利用工厂方法实现生产方法是相当自然的做法。
2. 工厂方法和抽象工厂都是负责创建对象,但工厂方法用的是继承, 而抽象工厂是通过组合。这意味着,利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。其实整个工厂方法模式, 只不过就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用抽象类型就可以了,而由子类来负责决定具体类型。所以, 换句话说,工厂方法只负责将客户从具体类型中解耦。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类型所写的代码中。所以和抽象工厂一样,抽象工厂可以把客户从所使用的具体产品中解耦,另一个优点是可以把一群相关的产品集合起来。
相同点:都能将对象的创建封装起来,使应用程序解耦,并降低其对特定实现的依赖。
例子