简单工厂模式 和 工厂方法模式(1)
2016-03-13 02:07
351 查看
一、什么是工厂模式
工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。例如用工厂来创建人这个对象,如果我们需要一个男人对象,工厂就会为我们创建一个男人;如果我们需要一个女人,工厂就会为我们生产一个女人(女娲娘娘的既视感啊)。
工厂模式通常分为:
简单工厂模式
工厂方法模式
抽象工厂模式
二、工厂模式类图
刚刚我们说到,用工厂模式来创建人。现在我们来当回 “女娲娘娘”,先创建一个男人,他每天都 “吃饭、睡觉、打豆豆”... 然后我们再创建一个女人,她每天也 “吃饭、睡觉、打豆豆”...(如果你叫豆豆,请放过我...)我们以简单工厂模式为例。
三、 简单工厂模式示例代码
Talk is cheap, show me the code.// 抽象产品 abstract class Human { public abstract void Eat(); public abstract void Sleep(); public abstract void Beat(); } // 具体产品-男人 class Man extends Human{ public void Eat() { System.out.println("Man can eat."); } public void Sleep() { System.out.println("Man can sleep."); } public void Beat() { System.out.println("Man can beat doudou."); } } // 具体产品-女人 class Female extends Human{ public void Eat() { System.out.println("Female can eat."); } public void Sleep() { System.out.println("Female can sleep."); } public void Beat() { System.out.println("Female can beat doudou."); } } // 简单工厂 public class HumanFactory { public static Human createHuman(String gender){ Human human = null; if( gender.equals("man") ){ human = new Man(); }else if( gender.equals("female")){ human = new Female(); } return human; } } // 女娲造人 public class Goddess { public static void main(String[] args) throws IOException { // 造个男人 Human human = HumanFactory.createHuman("man"); human.Eat(); human.Sleep(); human.Beat(); } }
简单工厂模式就是上面那样子了,那么工厂方法模式又有什么不同呢?工厂方法模式在简单工厂模式的基础之上,把简单工厂抽象化了。
四、工厂方法模式示例代码
// 抽象产品 abstract class Human { public abstract void Eat(); public abstract void Sleep(); public abstract void Beat(); } // 具体产品-男人 class Man extends Human { public void Eat() { System.out.println("Man can eat."); } public void Sleep() { System.out.println("Man can sleep."); } public void Beat() { System.out.println("Man can beat doudou."); } } // 具体产品-女人 class Female extends Human{ public void Eat() { System.out.println("Female can eat."); } public void Sleep() { System.out.println("Female can sleep."); } public void Beat() { System.out.println("Female can beat doudou."); } } // 简单工厂变为了抽象工厂 abstract class HumanFactory { public abstract Human createHuman(String gender) throws IOException; } // 具体工厂(每个具体工厂负责一个具体产品) class ManFactory extends HumanFactory{ public Human createHuman(String gender) throws IOException { return new Man(); } } class FemaleFactory extends HumanFactory{ public Human createHuman(String gender) throws IOException { return new Female(); } } // 女娲造人 public class Goddess { public static void main(String[] args) throws IOException { // 造个男人 HumanFactory hf = new ManFactory(); Human h = hf.createHuman("man"); h.Eat(); h.Sleep(); h.Beat(); } }
五、工厂模式应用
你可能就问了,工厂模式工厂模式的,我咋没见过哪儿用过啊?这这这儿,在 Java 库里面。根据不同的参数,getInstance() 方法会返回不同的 Calendar 对象。java.util.Calendar - getInstance() java.util.Calendar - getInstance(TimeZone zone) java.util.Calendar - getInstance(Locale aLocale) java.util.Calendar - getInstance(TimeZone zone, Locale aLocale) java.text.NumberFormat - getInstance() java.text.NumberFormat - getInstance(Locale inLocale)
相关文章推荐
- groovy/java自实现json解析器(2)JsonObject
- 10011---Bootstrap CSS
- WebView获取当前网页的页面元素
- Omnispace 收藏夹
- 注意,看CSDN的会卡的看这里
- CSS 常用命名
- 安卓基础学习记录1
- 大端模式与小端模式
- 第一个小应用:图片浏览器 之二 学会Assets、raw中的文件的读取
- java反射基本使用操作
- Mat类
- 开发笔记-UIApplication单例
- 设计模式——之代理模式(proxy)
- 矩阵掩模操作
- 薛老师软考高项学员:2016年3月9日作业
- 110. Balanced Binary Tree
- 如何使用OPENCV实现两张图片的混合(PS中的图层不透明度)
- Android中Activity启动模式详解
- 选什么时候验光效果最好?
- CodeForces 628D Magic Numbers(数位DP)