java反射机制---工厂设计模式的进化

一、基本使用和代码

 简单工厂模式
 使用步骤
1、创建抽象产品类 & 定义具体产品的公共接口;
2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例;
4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
public class Demo2 {
    public static void main(String args[]) {
//        4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
        Factory factory = new Factory();
        //生产商品A
        factory.makeProdect("A").nameOfCreatedProduct();

        //生产商品B
        factory.makeProdect("B").nameOfCreatedProduct();
    }
}
//1、创建抽象产品类 & 定义具体产品的公共接口;
abstract class Product {
    public abstract void nameOfCreatedProduct();
}

//2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
class ProductA extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品A");
    }
}

class ProductB extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品B");
    }
}


//3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例;
class ProductC extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品C");
    }
}


class Factory {
    public Product makeProdect(String productName) {
        switch (productName) {
            case "A":
                return new ProductA();

            case "B":
                return new ProductB();

            case "C":
                return new ProductC();
            default:
                return null;
        }
    }
}
优点:
1、将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
2、把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。

缺点
1、工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
2、违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂

二、工厂模式优化

解决的问题:
1、操作成本高:每增加一个接口的子类,必须修改工厂类的逻辑
2、系统复杂性提高:每增加一个接口的子类,都必须向工厂类添加逻辑
方案:
采用反射机制: 通过 传入子类名称 & 动态创建子类实例,从而使得在增加产品接口子类的情况下,也不需要修改工厂类的逻辑

代码实现:

public class Demo2 {
    public static void main(String args[]) {
//        4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
        Factory factory = new Factory();
        //生产商品A
        factory.makeProdect("com.example.javademo.ProductA").nameOfCreatedProduct();

        //生产商品B
        factory.makeProdect("com.example.javademo.ProductB").nameOfCreatedProduct();
    }
}
//1、创建抽象产品类 & 定义具体产品的公共接口;
abstract class Product {
    public abstract void nameOfCreatedProduct();
}

//2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
class ProductA extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品A");
    }
}

class ProductB extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品B");
    }
}


//3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例;
class ProductC extends Product {

    @Override
    public void nameOfCreatedProduct() {
        System.out.println("产品C");
    }
}



class Factory {
    //通过反射机制实现具体产品的创建
    public Product makeProdect(String productName) {
        Product product=null;
        try{
            //根据产品类名获取产品类型的Class对象
            Class pClass=Class.forName(productName);
            //通过Class对象动态创建该产品对象
            product= (Product) pClass.newInstance();

        }catch (Exception e){
            e.printStackTrace();
        }

        return product;
    }
}

猜你喜欢

转载自blog.csdn.net/u013359807/article/details/81216454
今日推荐