工厂方法模式
来源:互联网 发布:平面设计和淘宝美工 编辑:程序博客网 时间:2024/06/14 06:11
最近在读设计模式之禅,今天主要分享一下工厂方法设计模式,这里对工厂方法设计模式做一个总结。
首先以女娲造人故事拉开帷幕,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大地上生长,工艺过程没错,但是意外随时可能发生:
1.第一次拷泥人,感觉应该熟了,往大地一放,哇,没烤熟!于是一个白人诞生了!
2.第二次拷泥人,上一次没有烤熟,这次多烤一会,放到世间一看,嘿,熟过头了,于是黑人诞生了!
3.第三次拷泥人,一边烧制一边查看,直到表皮微黄,嘿,刚刚好,于是黄种人出现了!
以上述女娲造人过程来分析,该过程涉及到3个对象:女娲,八卦炉,三种不同肤色的人。我们可以把女娲当做类Client来表示,八卦炉类似工厂,人类看作产品来模拟工厂方法模式。
定义抽象产品(人类)Human类
public interface Human{ //获取人的肤色 public void getColor(); //人类交流 public void talk();}
定义具体产品类:
(黑人)BlackHuman类
public class BlackHuman implements Human{ @Override public void getColor() { // TODO Auto-generated method stub System.out.println("黑人的肤色是黑色的"); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("黑人讲话听不懂"); }}
(黄种人)YellowHuman类
public class YellowHuman implements Human{ @Override public void getColor() { // TODO Auto-generated method stub System.out.println("黄种人的肤色是黄色的"); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("黄种人很多讲汉语"); }}
(白人)WhiteHuman类
public class WhiteHuman implements Human{ @Override public void getColor() { // TODO Auto-generated method stub System.out.println("白人的肤色是白色的"); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("白人很多讲英语"); }}
定义抽象工厂类AbstractHumanFatory
public abstract class AbstractHumanFatory{ public abstract <T extends Human> T createHuman(Class<T> cl);}
定义具体工厂类(八卦炉)HumanFactory :
public class HumanFactory extends AbstractHumanFatory{ @SuppressWarnings("unchecked") @Override public <T extends Human> T createHuman(Class<T> cl) { // TODO Auto-generated method stub Human human = null; try{ human = (T)Class.forName(cl.getName()).newInstance(); }catch(Exception e) { System.out.println("造人失败"); } return (T)human; }}
定义场景类(女娲)NvWa类
public class NvWa{ public static void main(String[] args) { //八卦炉 AbstractHumanFatory bagualu = new HumanFactory(); //开始造白人 System.out.println("=============开始造白人==============="); Human whiteHuman = bagualu.createHuman(WhiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); //开始造黄人 System.out.println("=============开始造黄人==============="); Human yellowHuman = bagualu.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk(); //开始造黑人 System.out.println("=============开始造黑人==============="); Human blackHuman = bagualu.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); }}
女娲造人场景运行结果:
=============开始造白人===============白人的肤色是白色的白人很多讲英语=============开始造黄人===============黄种人的肤色是黄色的黄种人很多讲汉语=============开始造黑人===============黑人的肤色是黑色的黑人讲话听不懂
以上就是工厂方法模式。
工厂方法模式定义
工厂方法模式定义:Define an interface for creating an object,but let subclasses decide which class to instantiate Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到其子类)。
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Factory为抽象工厂类,具体如何创建产品有具体的实现工厂ConcreteFactory来完成。
工厂方法模式的优点:
1.良好的封装性,代码结构清晰,调用者需要一个具体产品对象,只需要知道这个产品类的类名就可以,不用知道如何具体创建的。
2.工厂方法模式扩展性优秀,增加产品类只要扩展一个工厂类就可。
3.屏蔽产品类,产品的实现如何变化,调用者并不需要关心,他只需要关心产品的接口。
4.工厂方法模式是典型的解耦框架,高层模块需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我们不需要交流,也符合依赖倒置原则,只依赖产品类的抽象,当然也符合里氏替换原则,使用产品子类替换父类产品父类。
工厂方法模式的缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)A+B
- 提取文件夹中所有文件名(Windows)
- mysql实现主从复制
- 简单常用的信号集操作函数
- <spark>flatmap 和 map
- 工厂方法模式
- 二叉树的遍历
- OkHttp文件上传及管理之初步实现
- Java Web 开发,eclipse 和MyEclipse搭建开发环境
- 安卓使用BroadcastReceiver监听接受短信信息
- 转qt 中的timer
- 正则表达式匹配网页的链接
- 开发问题汇总
- <spark>pairRDD