在整个项目的构建过程中,我们通常是通过new操作符去直接创建一个对象的实例,但是在复杂模型的情况下,直接去创建对象可能会带来一些问题,如:
- 可能需要通过计算或获取对象的初始设置,动态的选择生成哪个子对象实例;
- 在生成目标对象之前必须先生成一些辅助功能的实例对象。
在这些情况下,创建对象就需要这样的一系列“过程”,而不是一个简简单单的操作。在这种情况下,我们就考虑到能不能有一种方法,让我们不关心这些复杂的创建过程,而很容易的获取到我们想要的对象呢,这就引入了工厂模式,用工厂去给我们做这些复杂的过程。
工厂模式有三种:简单工厂模式、工厂方法模式和抽象工厂模式
1、简单工厂模式:建立一个工厂去负责对象的创建,我们不需要关心创建的细节,所有的构建过程都让工厂替我们完成,这就降低了 client 和具体产品之间的耦合程度。
2、工厂方法模式:
从上面可以看出,简单工厂模式非常简单,但是简单的同时也带来了许多问题,比如添加一种新的产品时候,需要更改已有的工厂类,这使得产品的添加去工厂类紧紧耦合到一起,为了解决这个问题,引入了工厂方法模式。
工厂方法模式去掉了简单工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里将产品创建集中在一起的压力就可以由工厂方法模式里的不同工厂子类来分担。
工厂方法模式通常由以下几部分组成:
- 抽象工厂角色:具体工厂角色必须实现的接口或者必须继承的父类
- 具体工厂角色:含有和具体业务逻辑相关的代码
- 抽象产品角色:它是具体产品继承的父类或者实现的接口
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例
3、抽象工厂模式:
工厂方法模式有效的解决了增加产品要修改原有的工厂类,但是它的工厂只能创建单个产品,而不能创建一个产品族,比如以北方的梨子、北方的香蕉为一个产品族,南方的例子、南方的香蕉为另外一个产品族,这时候工厂方法模式就有点力不从心了,因此引入了抽象工厂模式。
抽象工厂模式是所有形态的工厂模式中最为抽象的,它可以向客户端提供一个借口,使得客户端在不必指定产品的具体类型情况下,能够创建多个产品族对象。
,