zoukankan      html  css  js  c++  java
  • Java反射机制与工厂模式

    工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

    它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象。

    简单工厂模式如下:

     1 interface Car {
     2     public void Name();
     3 }
     4 class Audi implements Car {
     5     public void Name() {
     6         System.out.println("Audi");
     7     }
     8 }
     9 class Factory{
    10     private Factory() {}
    11     public static Car getInstance(String className) {
    12         if("Audi".equalsIgnoreCase(className)) {
    13             return new Audi();
    14         }
    15         return null;
    16     }
    17 }
    18 public class Test {
    19     public static void main(String[] args) throws Exception {
    20         Car audi = Factory.getInstance("Audi");
    21         audi.Name();
    22     }
    23 }
    简单工厂模式

    问题在于,可能会有很多的继承接口的子类,那么工厂类就要一直更新下去,很麻烦。这时候,就引入反射机制。

     1 package test;
     2 interface Car {
     3     public void Name();
     4 }
     5 class Audi implements Car {
     6     public void Name() {
     7         System.out.println("Audi");
     8     }
     9 }
    10 class Factory {
    11     private Factory() {}
    12     public static Car getInstance(String className) {
    13         Car instance = null;
    14         try {
    15             instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance();
    16         } catch (Exception e) {
    17             e.printStackTrace();
    18         }
    19         return instance;
    20     }
    21 }
    22 public class Test {
    23     public static void main(String[] args) throws Exception {
    24         Car msg = Factory.getInstance("test.Audi");
    25         msg.Name();
    26     }
    27 }
    工厂模式

    关于反射
    反射最大的作用之一就在于可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。
    功能:
    •在运行时能判断任意一个对象所属的类。
    •在运行时能构造任意一个类的对象。
    •在运行时判断任意一个类所具有的成员变量和方法。
    •在运行时调用任意一个对象的方法。
    说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。
    应用场景:
    反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。
    特点:
    由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

    最后,如果接口也特别多的话,工厂类里还是要写很多个方法,这个问题可以用泛型解决,这样的工厂模式叫抽象工厂模式

     1 package test;
     2 interface Car {
     3     public void Name();
     4 }
     5 class Audi implements Car {
     6     public void Name() {
     7         System.out.println("Audi");
     8     }
     9 }
    10 interface Phone{
    11     public void Name();
    12 }
    13 class iPhone implements Phone{
    14     public void Name() {
    15         System.out.println("iPhone");
    16     }
    17 }
    18 class Factory {
    19     private Factory() {}
    20 
    21     @SuppressWarnings("unchecked")
    22     //instanceName 接口的子类   className接口的类型
    23     public static <T> T getInstance(String instanceName, Class<T> className ) {
    24         T instance = null;
    25         try {
    26             instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
    27         } catch (Exception e) {
    28             e.printStackTrace();
    29         }
    30         return instance;
    31     }
    32 }
    33 public class Test {
    34     public static void main(String[] args) throws Exception {
    35         Car audi = Factory.getInstance("test.Audi", Car.class);
    36         audi.Name();
    37         iPhone iphonex = Factory.getInstance("test.iPhone", iPhone.class);
    38         iphonex.Name();
    39     }
    40 }
    抽象工厂模式

     面试题:什么是java反射机制?

    反射机制是 Java 语言提供的一种基础功能,赋予程序在时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个

    对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

  • 相关阅读:
    IPC---信号量
    static的用法
    模拟对话框的实现
    Dom选择器使用与调试记录
    第一个javascript脚本
    javascript基础总汇
    overflow的量两种模式
    固定标签到页面
    固定标签到某个标签
    固定标签(position: fixed)
  • 原文地址:https://www.cnblogs.com/flyuz/p/10402906.html
Copyright © 2011-2022 走看看