工厂方法模式

来源:互联网 发布:淘宝四川百灵鸟笼子 编辑:程序博客网 时间:2024/04/29 18:31

1.定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

2.通用类图

工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。


3.举例

女娲造人的例子,女娲可以看成是一个场景类。Human接口看成是产品,而下面的三个实现类则可以看成是具体的产品。AbstractHumanFactory看成是Creator,HumanFactory看成是具体的Creator。类图如下:


Human接口代码如下:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:28:14* 类说明*/public interface Human {public void getColor();public void talk();} 
BlackHuman代码:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:36:48* 类说明*/public class BlackHuman implements Human {@Overridepublic void getColor() {System.out.println("我的皮肤是黑色的");}@Overridepublic void talk() {System.out.println("黑人的话别人听不懂");}} 
WhiteHuman:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:38:59* 类说明*/public class WhiteHuman implements Human {@Overridepublic void getColor() {System.out.println("我的皮肤是白色的");}@Overridepublic void talk() {System.out.println("我会说英语");}} 
YellowHuman:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:40:04* 类说明*/public class YellowHuman implements Human {@Overridepublic void getColor() {System.out.println("我的皮肤是黄色的");}@Overridepublic void talk() {System.out.println("我说的是汉语");}} 
AbstractHumanFactory:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:41:45* 类说明*/public abstract class AbstractHumanFactory {public abstract <T extends Human> T createHuman(Class<T> c);} 
HumanFactory:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:54:50* 类说明*/public class HumanFactory extends AbstractHumanFactory {@Overridepublic <T extends Human> T createHuman(Class<T> c) {Human human = null;try {human = (Human) Class.forName(c.getName()).newInstance();} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {System.out.println("创建人种产生错误");}return (T) human;}} 
女娲类(模拟场景类)NvWa:

package com.cqu.factory_method;   /*** @author 作者:MaJie E-mail:majiecqu@126.com* @version 创建时间:2017年3月14日 下午3:57:57* 类说明*/public class NvWa {public static void main(String[] args) {AbstractHumanFactory factory = new HumanFactory();System.out.println("创建白人:");Human whiteHuman = factory.createHuman(WhiteHuman.class);whiteHuman.getColor();whiteHuman.talk();System.out.println();System.out.println("创建黑人");Human blackHuman = factory.createHuman(BlackHuman.class);blackHuman.getColor();blackHuman.talk();System.out.println();System.out.println("创建黄人");Human yellowHuman = factory.createHuman(YellowHuman.class);yellowHuman.getColor();yellowHuman.talk();}} 
执行结果:

创建白人:我的皮肤是白色的我会说英语创建黑人我的皮肤是黑色的黑人的话别人听不懂创建黄人我的皮肤是黄色的我说的是汉语
*注:该工厂方法模式为看秦小波著《设计模式之禅》总结,详情请看该书工厂方法模式一章。

1 0
原创粉丝点击