1、工厂方法
Client调用父类提供的接口,但是需要根据不同的参数,获得不同的子类实例。
例如:Client是一个智能手机测评人,他需要测试不同品牌智能手机的功能,如打电话、照相等。作为测评人,
Client不需要知道手机怎么生产的,他只需要从某东下订单,买一些华为、小米或苹果手机就可以了。
上面,手机就是父类,手机功能就是接口,某东就是工厂方法,华为等品牌就是参数,华为手机等就是子类实例。
关键:一个父类,一个工厂,多个子类。
2、抽象工厂
Client调用一组父类接口(配套使用),但是需要根据不同的参数,获得对应的一组子类实例。
例如:Client是一个室内设计师,他的客户可能会要求使用的家电是同一品牌。但Client其实是不用管用的是什么牌子的,
他只需要设计电视应该放在哪,冰箱应该放在哪。在设计好之后,再到不同品牌的商城取货就行了。
这里,各种家电就是一组父类。商城就是抽象工厂,具体品牌商城就是工厂实例。(可以给各个抽象工厂建一个工厂方法)
关键:N组父类,N个工厂,N*M个子类,配套使用。
3、构建者
Client调用父类提供的接口,但是根据不同参数,不仅获得不同子类,同时调整子类的生成方式,进而影响子类的表现。
例如:Client还是一个智能手机测评人,但是更出名,要求也更高,他希望获对手机有一些改动,例如root,统一使用原生系统等。
这时业务比较复杂,Client需要一个助理(Director),用来获得Client所需要的各种手机。但助理不会root,也不会刷机,
所以需要每个品牌厂家派一个Builder来处理这些问题。
相比工厂方法,这里多了一个Director,而工厂类也被各种类型Builder代替。构建者会影响子类的生成。Client只需要和Director打交道。
关键:一个子类一个Builder,参数影响子类实例化。
总结:以工厂方法为基础。构建者多了一个功能,它影响了子类的实例化,也因此多了一个Director,并用多个Builder替换了Factory。
抽象工厂相当于有多个工厂方法,所以需要一个抽象工厂来提供统一接口。不同工厂提供的一组产品使用方式一样,但可能需要配套使用。