工厂设计模式
来源:互联网 发布:采购数据分析报告范本 编辑:程序博客网 时间:2024/06/05 00:18
工厂设计模式
工厂设计模式(Factory Pattern)是Java中最常用的设计模式之一。属于创建型模式,工厂设计模式提供了一种创建对象的最佳方式。
方式一:使用new关键字进行对象的实例化操作。
优点:
1.一个调用者想创建一个对象,只要知道其名称就可以了。
2.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂。
代码实现
// 定义接口interface Fruit{ public void eat();}// 创建实现接口的实体类class Apple implements Fruit{ // 覆写接口方法 public void eat() { System.out.println("吃苹果."); }}// 创建一个工厂,生成基于给定信息的实体类的对象。class Factory{ public static Fruit getInstance(String className) { if("Apple".equals(className)) { return new Apple(); } return null; }}// 测试类public class TestDemo{ public static void main(String [] args) { Fruit f = Factory.getInstance("Apple"); f.eat(); }}
程序运行结果:
吃苹果
通过此程序可以发现,主方法不再和具体的子类耦合在一起了,其中间经历了一个过度,主方法中的操作越简单了。但是存在一个问题:如果添加了新的子类,需要修改Factory类.如添加如下子类:
class Pear implements Fruit{ public void eat() { System.out.println("吃梨."); }}
那么Factory类应修改如下:
// 工厂类的实现class Factory{ public static Fruit getInstance(String className) { if("Apple".equals(className)) { return new Apple(); } if("Pear".equals(className)) { return new Pear(); } return null; }}
使用方式二实现的工厂类可以避免这个问题。
方式二:使用反射机制实例化对象。
在使用反射机制实例化对象之前,先简要的说明一下反射机制:Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。
Java 反射机制主要提供了以下功能:
1.
2.
3.
4.
在java的反射机制中,Class类是所有反射操作的源头。下面主要简要介绍如何获得Class类对象,以及通过所取得的Class类对象完成对象的实例化。
获得Class类对象:使用Class内部定义的pulbic static Class<?> forName(String className)throws ClassNotFoundException
方法
通过反射实例化对象:使用Class内部定义的public T newInstance() throws InstantationExceptio,IllegalAccessException
方法
class Test{ @Override public String toString(){ return "Test类对象."; }}public class TestDemo{ public static void main(String [] args)throws Exception{ // 获得Class类对象 Class<?> cls = Class.forName("Test"); // 使用Class类对象实例化Test类对象 Object obj = cls.newInstance(); // 向下转型 Test test = (Test)obj; System.out.println(test.toString()); }}
程序运行结果:
Test类对象.
现在可以发现,对于对象的实例化操作,除了使用new关键字之外又多了一个反射机制操作。下面使用反射机制操作完成工厂设计模式。
// 定义接口interface Fruit{ public void eat();}// 创建实现接口的实体类class Apple implements Fruit{ // 覆写接口方法 public void eat() { System.out.println("吃苹果."); }}// 创建一个工厂,生成基于给定信息的实体类的对象。class Factory{ public static Fruit getInstance(String className) { Fruit f = null; try { // 获取Class类对象 Class<?> cls = Class.forName(className); // 使用Class类对象完成对象实例化操作 f = (Fruit)cls.newInstance(); } catch(Exception e) { e.printStackTrace(); } return f; }}// 测试类public class TestDemo{ public static void main(String [] args) { Fruit f = Factory.getInstance("Apple"); f.eat(); }}
程序运行结果:
吃苹果.
这时候即使增加了接口的子类,工厂类照样可以完成对象的实例化操作,这才是真正的工厂类,可以应对所有的变化。如下添加Pear子类,那么主方法要实例化Pear子类对象,只需作改变工厂类getInstance()方法的参数,而不需要需改工厂类。
// 创建实现接口的实体类class Pear implements Fruit{ // 覆写接口方法 public void eat() { System.out.println("吃梨."); }}// 主方法public static void main(String [] args) { Fruit pear = Factory.getInstance("Pear"); Fruit apple = Factory.getInstance("Apple"); pear.eat(); apple.eat(); }
程序运行结果:
吃梨.
吃苹果.
- 设计模式--工厂设计
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- Xamarin.iOS 条形码扫描
- 光流总结
- swift 开发 - 常用函数
- MySQL Migration Toolkit 安装
- c++和Python 进阶篇笔记(一)
- 工厂设计模式
- Win7+Ubuntu双系统时间不一致
- Restore IP Addresses
- Java常考面试题8 深刻认识JAVA重载和重写 以及是否可以根据返回类型来区分重载
- Hadoop之HDFS初步认识(一)
- js 高程学习总结 第四章
- redis linux-单个配置流程
- java中循环遍历删除List和Set集合中元素的方法
- catalina.properties细说