一、定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
二、结构类图:
三、工厂角色:
01.抽象工厂角色
02.具体工厂角色
03.抽象产品角色
04.具体产品角色
工厂方法模式各个角色描述如下:
01.抽象工厂角色
抽象工类厂将具体工厂类的实现细节隐藏起来,如果具体工厂实现类发生过变化,对外部客户端的调用没有任何影响。这也说明了工厂类具有多态性,抽象工厂一定不可以实例化,这需要根据具体工厂类的实例来完成产品对象的创建。
因为抽象工厂类中给出了抽象方法,任何具体的工厂实现类都需要继承(或实现)抽象工厂类(或工厂接口)。同样,客户端要求创建产品类的对象,抽象工厂方法执行创建后,返回值为抽象产品类型,客户端已经根据具体的创建要求进行请求了,一定能够知道获取到的对象是哪个具体产品类的对象。
02.具体工厂角色
具体工厂类是依赖于具体的产品的,每一个产品的进行实例化的方式的改变,都将对对应的具体工厂类产生影响。具体工厂类的实现方式发生了改变,是不会对抽象工厂类产生影响的,因为具体工厂类遵守了抽象工厂方法的定义。
诚然,具体工厂类依赖于具体产品类。倘若只有一个具体工厂类,如果具体产品增加或者创建方式改变,简单工厂模式和工厂方法模式还是存在细微的差别的,简单工厂模式中的具体工厂类与工厂方法模式中的抽象工厂都能够屏蔽产品对象的创建,不同的是简单工厂模式中的具体工厂类需要做修改,而工厂方法模式中的抽象工厂不需要修改。
03.抽象产品角色
抽象产品类向任何发出产品对象创建的客户端屏蔽了产品的细节,也就是说,通过抽象工厂类的抽象工厂法获取到的对象具有相同的“外貌”,对每一个客户端是没有任何差别的。
抽象产品类可以使用抽象类或者借口来定义。
04.具体产品角色
具体产品类具有产品对象的数据和服务,客户端通过获取到所需要的产品对象,来完成特定的业务流程。具体产品类的创建方式,对于具体工厂类来说是可见的,具体工厂类也只需要知道具体产品类的创建方式,并且具体产品类是继承(或实现)抽象工厂类的抽象工厂方法中所要求的抽象产品类类型。
四、总结:
工厂方式模式最显著的特征就是:
1.比简单工厂方法增加了抽象工厂角色,屏蔽了具体工厂角色的细节。
2.工厂方法模式主要是针对同一个产品等级,工厂方法返回同一种抽象产品类类型。
3.比简单工厂方法更容易扩展产品等级,增加该抽象产品类的一个具体产品类,可以增加一个具体工厂类与之对应,而其它具体工厂类无需改动。
缺陷:选择具体产品对象和工厂方法耦合。
本质:延迟到子类选择实现例。
与简单工厂的比较:从本质上讲都是“选择实现”,不同的是,简单工厂是在工厂类里面进行“选择实现”;工厂方法是延迟到子类中进行选择实现,工厂类里面使用工厂方法的地方是依赖于抽象而不是具体实现,从而使系统更灵活,扩展性和可维护性更强。