美文网首页
Java 反射 -- 工厂模式的演变

Java 反射 -- 工厂模式的演变

作者: Sheldon_Yu | 来源:发表于2018-09-12 11:01 被阅读0次

准备些接口和类

public interface IMessage {
    void send();
}

public class NetMessage implements IMessage {
    @Override
    public void send() {
        System.out.println("由网络发送消息");
    }
}

public class QueueMessage implements IMessage {
    @Override
    public void send() {
        System.out.println("由消息队列发送消息");
    }
}

public interface ISay {
    void say();
}

public class Duck implements ISay {
    @Override
    public void say() {
        System.out.println("鸭子呱呱叫");
    }
}

接口直接实例化

public class JavaDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        IMessage message = new NetMessage();
        message.send();
    }
}

弊端:IMessage接口 与 NetMessage子类耦合

静态工厂类

public class Factory {
    private static IMessage message = null;

    private Factory(){}

    public static IMessage getInstance(String className){
        if("NetMessage".equals(className)){
            message = new NetMessage();
        }else if("QueueMessage".equals(className)){
            message = new QueueMessage();
        }
        return message;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        IMessage message = Factory.getInstance("QueueMessage");
        message.send();
    }
}

弊端:当一个接口每多了一个子类,就需要在工厂类中添加一个对应的分支,不符合开闭原则(对于扩展是开放的,对于修改是关闭的)

为一个接口服务的工厂类(反射)

public class Factory {

    private Factory(){}

    public static IMessage getInstance(String className) {
        IMessage instance = null;
        try {
            instance = (IMessage) Class.forName(className).newInstance();
        } catch(Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws Exception {
        IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage");
        message.send();
    }
}

考虑:如果项目中有很多接口,是不是需要写很过工厂类或者方法啊?

为所有接口服务的工厂类(反射 + 泛型)

public class Factory {

    private Factory(){}

    public static <T> T getInstance(String className,Class<T> cls) {
        T instance = null;
        try {
            instance = (T) Class.forName(className).newInstance();
        } catch(Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws Exception {
        IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage",IMessage.class);
        message.send();
        ISay duck = Factory.getInstance("com.sheldon.demo.Duck",ISay.class);
        duck.say();
    }
}

相关文章

  • Java 反射 -- 工厂模式的演变

    准备些接口和类 接口直接实例化 弊端:IMessage接口 与 NetMessage子类耦合 静态工厂类 弊端:当...

  • 简单工厂

    1.面向接口编程 2.简单工厂模式实例 使用java反射改进:

  • 使用Java反射机制模仿Spring IOC

    Spring IOC的实现是由工厂模式和Java的反射机制完成的。我们可以自己写一个beanfactory通过反射...

  • Java与模式

    《JAVA与模式》之简单工厂模式《JAVA与模式》之工厂方法模式《JAVA与模式》之抽象工厂模式

  • spring 设计模式篇—工厂模式

    一、解决了什么问题? 二、工厂模式演变过程,及代码实现demo 三、源-简单工厂 Car.java BmCar.j...

  • Java 反射进阶

    1. 使用反射调用方法 2. 工厂模式 工厂模式主要负责对象创建的问题可通过反射进行工厂模式的设计,完成动态的对象...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • Java设计模式教程

    Java设计模式教程 Java工厂设计模式 Java抽象工厂模式 Java单例模式 Java建造者(Builder...

  • springIOC实现原理

    所使用的技术 ① dom4j解析xml文档; ② 工厂模式(在工厂中调用反射) ③ 采用反射设计模式创建对象 IO...

  • java设计模式

    一、《JAVA与模式》之工厂方法模式 二、《JAVA与模式》之抽象工厂模式 三、《JAVA与模式》之单例模式 四、...

网友评论

      本文标题:Java 反射 -- 工厂模式的演变

      本文链接:https://www.haomeiwen.com/subject/sibygftx.html