一、简单工厂模式
以生产电脑举例。
1、创建电脑父类,该父类提供构造方法。
2、创建子类,如联想电脑以及苹果电脑均继承父类“电脑”,重写父类的构造方法,不同的电脑构造方法也有所不同。
3、提供工厂类,工厂类提供一个生产电脑的公有方法,方法的返回为电脑,方法参数即为不同的电脑传值,如电脑名称,可以传值“联想”或者“苹果”。方法内部判断传值,如果传值为“联想”,则调用联想电脑的构造方法,返回联想电脑;如果传值为“苹果”,则调用苹果电脑的构造方法,返回苹果电脑。
4、创建工厂类实例,调用工厂类的生产电脑的方法,只需要在方法的传值中设定不同的电脑名称,既可以得到不同的电脑子类对象。
二、工厂方法模式
还是以生产电脑举例。
1/2步与简单工厂模式一致。
3、创建工厂类接口。
4、创建不同的工厂类实现,如苹果电脑工厂、联想电脑工厂,电脑工厂提供生产电脑的方法,方法返回与工厂相对应的电脑。
5、创建不同的工厂类实例,调用工厂类的生产电脑的方法,即可得到不同的电脑子类对象。
简单工厂模式与工厂方法模式的相同点:
(1)产品类都是一致的,如上举例即,都有电脑父类以及不同的电脑子类实现父类。
不同点:
(1)简单工厂模式只有一个工厂类,它是通过“创建电脑”的方法的传值来判断究竟是返回何种电脑;而工厂方法模式,则有多少个子类实现,即有多少个工厂,如上举例即为有多少种电脑,就有多少种电脑工厂,每种工厂只生产相对应的电脑.
(2)当用户需要得到指定的电脑时,使用简单工厂模式下,实例化的都是同一个工厂类(只有一个工厂类),只是在调用工厂类的“创建电脑”方法时,通过不同的方法传值来指定创建何种电脑;在使用工厂方法模式下,用户需要何种电脑,则需要先实例化相对应的电脑工厂,再调用工厂类的“创建电脑”方法得到指定的电脑。
总结:简单工厂模式是通过工厂类创建方法的传值来判断实例化何种子类对象,工厂方法模式是通过创建不同的工厂类,来生产指定的电脑。
三、抽象工厂模式
还是以电脑举例,如电脑有不同的显卡和处理器,这里假设苹果电脑使用英伟达的显卡和英特尔的处理器,联想电脑使用超微的显卡和超微的处理器。
1、创建显卡的父类接口,并创建英伟达和超微的显卡子类显现接口,不同的子类返回不同的显卡。
2、创建处理器的父类接口,并创建英特尔和超微的处理器子类实现接口,不同的子类返回不同的处理器。
3、创建电脑工厂父类接口,接口内部提供两个抽象方法,一个是生产处理器,另一个是生产显卡。
4、创建不同子类电脑工厂实现父类接口,如苹果电脑工厂和联想电脑工厂,电脑工厂子类内部重写父类的生产处理器和生产显卡方法。苹果电脑工厂内部的生产处理器的方法则返回英特尔的处理器,生产显卡的方法则返回英伟达的显卡;联想电脑工厂同理。
5、用户想要生产苹果电脑,则先实例化苹果电脑工厂子类对象,再调用苹果电脑工厂的生产显卡和生产处理器的方法,即可得到一台显卡是英伟达处理器是英特尔的苹果电脑了;联想电脑同理。
总结:抽象工厂模式和工厂方法模式很相似,只不过工厂方法模式的只提供一个方法去创建子类,你是苹果电脑工厂则生产苹果电脑;而抽象方法模式则可以设置更详细的子类,比如苹果电脑工厂,生产的也是苹果电脑,但是苹果电脑的显卡和处理器是跟工厂提供的方法挂钩的,所以抽象工厂模式更为详细。