欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-19 19:19:52
...

一、基本使用和代码

 简单工厂模式
 使用步骤
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;
    }
}