工厂方法模式

属于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中有他的影子。它属于创建型模式,工厂父类提供创建产品对象的接口,具体的工厂类实现该接口,并创建相应的对象。这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。

最新文章

  1. truncate table和delete table 的区别
  2. 初探ECMAScript6
  3. 9月8日HTML表单元素(form、文本、按钮、选择)
  4. 测试C++代码与WebBrowser HTML的互动
  5. Java基础-数据类型int,short,char,long,float,double,boolean,byte
  6. struts2文件下载,动态设置资源地址
  7. pip使用国内镜像服务器
  8. linux包转发开发
  9. [Android开发系列]IT博客应用V1.3
  10. 3563: DZY Loves Chinese - BZOJ
  11. Innodb 锁 (简单笔记)
  12. dojo事件
  13. (step 8.2.13)hdu 1524(A Chess Game)
  14. 微信公众平台消息接口PHP版开发教程
  15. magento产品批量导出导入
  16. 关于VO中的Attribute的问题
  17. Ubuntu 14.04 配置iptables防火墙
  18. JSONP原理解析
  19. segment.go
  20. Nginx 代理配置

热门文章

  1. Java的动手动脑(五)
  2. requests 的基本用法
  3. LeetCode(69):x 的平方根
  4. jsp 标签文件
  5. Laravel 项目中使用 Bootstrap 框架
  6. 关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法
  7. PEM routines:PEM_read_bio:no start line
  8. flanneld,flannel和cni逐步深入
  9. thinkphp5验证码使用
  10. some advice in work