Java高级特性——通过反射获取类的几种方式——并利用反射对工厂模式解耦操作(代码示例)

第一种方式:getClass
getClass获取类首先需要有实例化对象

 Date date = new Date();
 Class<?> cls = date.getClass();
 System.out.println(cls.getName());

第二种方式:.class
.class获取类不需要有实例化对象,但是需要完整类名

  Class<?> cls2 = java.util.Date.class;
  System.out.println(cls2.getName());

第三种方式:.forName()
调用.forName()需要有完整的类名

Class<?> cls3 = Class.forName("java.util.Date");
System.out.println(cls3.getCanonicalName());

运行结果:

学了上面的三种主要获取类方式,那么来实践玩玩吧

把之前写的工厂方法模式拿出来看看存在的问题,还没看的或者有兴趣的可以看看,当然不看也行,因为我这里会重新敲一遍工厂模式(为什么要重新敲呢?相当于一个简单的重构吧,让代码更健壮一点点,哈哈…)
好了,链接放就这,然后来看看下面的问题

Java设计模式:工厂模式——图文+代码示例(通俗易懂)

简单工厂模式里的工厂类(也是静态工厂模式):每次出新的手机牌子就需要修改工厂类违反开闭原则
在这里插入图片描述
工厂方法模式呢?看看消费者类获取手机需要new,我们都知道解决耦合的关键是取消new,因为new是耦合的最大元凶,所以我们接下来用反射来帮助我们解决设计上的缺陷。
在这里插入图片描述
来,利用反射对工厂模式解耦操作!

Phone接口

public interface Phone {
    void getBrand();
}

Meizu品牌类

public class Meizu implements Phone {
    @Override
    public void getBrand() {
        System.out.println("魅族");
    }
}

Xiaomi品牌类

public class Xiaomi implements Phone {
    @Override
    public void getBrand() {
        System.out.println("小米");
    }
}

PhoneFactory工厂类
利用最开始讲的反射三种获取对象之一的Class.forName(传入完整的包类名)找到它的类,然后使用newInstance()方法反射的对象实例化

public class PhoneFactory {
    public static Phone getInstance(String orgin) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> cls  = Class.forName(orgin);
        Phone brand = (Phone)cls.newInstance();
        return brand;
    }
}

Customer 消费者类,直白一点说就是可以传值了,而无需用new写死

public class Customer {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        PhoneFactory.getInstance("Factory.Xiaomi").getBrand();
        PhoneFactory.getInstance("Factory.Meizu").getBrand();
    }
}

运行结果:
在这里插入图片描述
可以看到上面代码可以说和静态工厂模式一样,只不过工厂模式利用了反射机制,不再只是用new关键字而是用反射机制来。

最后

实践一波后会发现,对象实例化不再是单独用new来,反射也是可以完成的(当然反射还是需要考虑到性能的,这是后话,到时可以一起来探究一下原理),当然这不表示new会完全被取代,在一些开发中也会经常用到new这个关键字

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Java代码实现抽象工厂模式: ```java // 定义抽象产品A interface ProductA { void operationA(); } // 定义具体产品A1 class ProductA1 implements ProductA { @Override public void operationA() { System.out.println("ProductA1 operationA"); } } // 定义具体产品A2 class ProductA2 implements ProductA { @Override public void operationA() { System.out.println("ProductA2 operationA"); } } // 定义抽象产品B interface ProductB { void operationB(); } // 定义具体产品B1 class ProductB1 implements ProductB { @Override public void operationB() { System.out.println("ProductB1 operationB"); } } // 定义具体产品B2 class ProductB2 implements ProductB { @Override public void operationB() { System.out.println("ProductB2 operationB"); } } // 定义抽象工厂 interface AbstractFactory { ProductA createProductA(); ProductB createProductB(); } // 定义具体工厂1 class ConcreteFactory1 implements AbstractFactory { @Override public ProductA createProductA() { return new ProductA1(); } @Override public ProductB createProductB() { return new ProductB1(); } } // 定义具体工厂2 class ConcreteFactory2 implements AbstractFactory { @Override public ProductA createProductA() { return new ProductA2(); } @Override public ProductB createProductB() { return new ProductB2(); } } ``` 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而无需指定它们具体的。相比于简单工厂模式和工厂方法模式,抽象工厂模式更加灵活,可以创建一组产品系列。它的优点包括: 1. 将客户端与具体的解耦,客户端只需要知道抽象工厂和抽象产品即可; 2. 可以保证产品系列的一致性,即创建出的一组产品都是相互匹配的; 3. 可以方便地添加新的产品系列,只需要添加新的具体工厂和具体产品即可。 抽象工厂模式的缺点包括: 1. 增加了系统的复杂度,每增加一个产品系列,就需要增加一个具体工厂; 2. 在添加新产品时,需要修改抽象工厂接口及其所有的子,这可能会影响到其他已经实现的产品系列。 抽象工厂模式适用于以下场景: 1. 需要创建一组相关或相互依赖的对象; 2. 需要保证产品系列的一致性; 3. 需要方便地添加新的产品系列。 例如,在一个计算机生产厂商中,可以使用抽象工厂模式来创建一组相关的产品系列,如CPU、主板、内存等,每个系列都有不同的品牌和型号。客户端只需要选择具体的工厂,即可创建出一组相互匹配的产品。在添加新的产品系列时,只需要添加具体工厂和具体产品即可,不需要修改现有的代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值