Java设计模式从精通到入门四 工厂方法模式
2024-10-13 14:23:51
工厂方法模式
属于23中设计模式中创建型类型。
核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类。
来源
设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟的为黑人,刚好的为黄种人的例子进行程序展示
女娲作为client,八卦炉为工厂类,人类为具体实现类,有皮肤的区别。
UML类图
图一
Factory: 工厂类的接口,根据类类型,提供只能创建Human子类,或者子孙类的方法。
HumanFactory: 工厂类的具体实现,通过反射获取该对象。
Human: 提供获取人类皮肤的接口。
WhiteHuman: Human的具体实现类
BlackHuman: Human的具体实现类
YellowHuman: Human的具体实现类
核心代码
Factory类:
public interface Factory {
/**
* @Author ouyangkang
* @Description 提供返回人类比较具体的实例
* @Date 10:04 2019/1/11
* @param c
* @return T
**/
<T extends Human> T getInstance(Class< ? extends Human> c);
}
HumanFactory类:
public class HumanFactory implements Factory {
/**
* @Author ouyangkang
* @Description 实现
* @Date 10:05 2019/1/11
* @param c
* @return T
**/
@Override
public <T extends Human> T getInstance(Class<? extends Human> c) {
if (c != null){
try {
return (T) c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
}
Human类:
public interface Human {
/**
* @Author ouyangkang
* @Description 获取人类皮肤颜色
* @Date 10:05 2019/1/11
* @param
* @return void
**/
void getColor();
}
WhiteHuman类:
public class WhiteHuman implements Human {
@Override
public void getColor() {
System.out.println("白色人种");
}
}
BlackHuman类:
public class BlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑色人种");
}
}
YellowHuman类
public class YellowHuman implements Human {
@Override
public void getColor() {
System.out.println("黄色人种");
}
}
Client类
public class Client {
public static void main(String[] args) {
Factory factory = new HumanFactory();
Human instance = factory.getInstance(WhiteHuman.class);
instance.getColor();
factory.getInstance(BlackHuman.class).getColor();
factory.getInstance(YellowHuman.class).getColor();
}
}
输出结果:
白色人种
黑色人种
黄色人种
总结
工厂方法是一个非常常见的设计模式。Spring中有他的影子。它属于创建型模式,工厂父类提供创建产品对象的接口,具体的工厂类实现该接口,并创建相应的对象。这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。
最新文章
- truncate table和delete table 的区别
- 初探ECMAScript6
- 9月8日HTML表单元素(form、文本、按钮、选择)
- 测试C++代码与WebBrowser HTML的互动
- Java基础-数据类型int,short,char,long,float,double,boolean,byte
- struts2文件下载,动态设置资源地址
- pip使用国内镜像服务器
- linux包转发开发
- [Android开发系列]IT博客应用V1.3
- 3563: DZY Loves Chinese - BZOJ
- Innodb 锁 (简单笔记)
- dojo事件
- (step 8.2.13)hdu 1524(A Chess Game)
- 微信公众平台消息接口PHP版开发教程
- magento产品批量导出导入
- 关于VO中的Attribute的问题
- Ubuntu 14.04 配置iptables防火墙
- JSONP原理解析
- segment.go
- Nginx 代理配置