设计模式(2):工厂方法模式
2015-07-27 10:20
232 查看
工厂方法模式:
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使用一个类的实例化延迟到子类。
举个栗子:我们要生产水果罐头,我们应该怎么做呢?
首先,我们需要准备好原料。其次我们需要一个罐头工厂,往工厂里运送不同的原料,出来的就是不同的罐头。
原料就是苹果啊、橘子啊等等的这些类。
工厂呢就是能够生产水果罐头的工厂啊。
场景类:
书中的例子:女娲造人,产生各种肤色的人。
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使用一个类的实例化延迟到子类。
举个栗子:我们要生产水果罐头,我们应该怎么做呢?
首先,我们需要准备好原料。其次我们需要一个罐头工厂,往工厂里运送不同的原料,出来的就是不同的罐头。
原料就是苹果啊、橘子啊等等的这些类。
interface IFruits { public void taste(); } class Apple implements IFruits { public void taste() { System.out.println("I'm apple"); } } class Orange implements IFruits { public void taste() { System.out.println("I'm orange"); } }
工厂呢就是能够生产水果罐头的工厂啊。
abstract class AbstractFactory { // 采用泛型对输入参数进行限制: // 1.必须是Class类型 // 2.必须是IFruits类型的子类 public abstract <T extends IFruits> T createCan(Class<T> c); } class Factory extends AbstractFactory { @Override public <T extends IFruits> T createCan(Class<T> c) { IFruits fruits = null; try { fruits = (IFruits) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) fruits; } }
场景类:
public class Client { public static void main(String[] args) { AbstractFactory factory = new Factory(); IFruits apple = factory.createCan(Apple.class); apple.taste(); IFruits orange = factory.createCan(Orange.class); orange.taste(); } }
书中的例子:女娲造人,产生各种肤色的人。
package ne; interface Human { public void say(); } class Black_human implements Human { public void say() { System.out.println("I'm black"); } } class Yellow_human implements Human { public void say() { System.out.println("I'm yellow"); } } abstract class AbstractFactory { public abstract <T extends Human> T createHuman(Class<T> c); } class Factory extends AbstractFactory { @Override public <T extends Human> T createHuman(Class<T> c) { Human human = null; try { human = (Human) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) human; } } public class Client { public static void main(String[] args) { AbstractFactory factory = new Factory(); Human black_human = factory.createHuman(Black_human.class); Human yellow_human = factory.createHuman(Yellow_human.class); black_human.say(); yellow_human.say(); } }
相关文章推荐
- Server 2008 (IIS7) HRESULT: 0x800A03EC 错误问题解决办法
- 强大的安卓手机远程管理工具 – Droidjack
- 国内外域名商.xyz域名总量TOP10统计报告(7月23日)
- Android 模拟 Http GET 请求
- 图片预览
- 玩转Android---UI篇---EditText(编辑框)
- Android控件开发之Toast
- 认识单元测试中的打桩
- 下载服务器代码出现fatal: git 1.7.2 or later required的问题解决方法
- 【第四篇】androidEventbus源代码阅读和分析
- c++空类实例大小不是0原因
- Android Service与Activity之间通信的几种方式
- java中注解用法
- LeetCode OJ 之 House Robber II (抢劫犯 - 二)
- 关于Class.getResource和ClassLoader.getResource的路径问题
- Android控件开发之Dialog
- 函数绑定在Java和C++中的区别
- 《转》Ceilometer Alarm API 参数详解 及 举例说明
- 百度地图的简单使用 ——html js
- xcode6 AsynchronousTesting 异步任务测试