工厂模式&抽象工厂

1.简单工厂

uml类图:

 简单工厂使类创建对象时更灵活,但是不符合开闭原则

2.工厂模式

uml类图:

 

 工厂模式虽然符合了开闭原则,但是却丧失了原本的灵活性需求

3.抽象工厂

uml类图:

 抽象工厂可以处理两种完全无关的产品,但是它既不符合开闭原则又没有灵活性,所以需要用简单工厂进行改进

改进后:

它具有了简单工厂的灵活性,但是由于使用了switch case进行判断,所以还是不符合开闭原则,所以可以继续改进,使用反射技术代替switch判断

以下是一个计算类的简单工厂使用反射改变后的代码:

简单工厂类:

public class OperationFactory {
    public static Operation createOperation(String operate) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException{
        String name = new Config("configA.properties").outValue(operate);
        Class<?> operateClass = Class.forName(name);
        Class<?> addOperation = Class.forName("AddOperation");
        Object o = operateClass.newInstance();
        return (Operation) o;
    }
}

运算类:

public class Operation {
    int num1;
    int num2;

    public void setNum1(int num1) {
        this.num1 = num1;
    }
    public void setNum2(int num2) {
        this.num2 = num2;
    }
    public double getResult(){
        return 1;
    }
}

加法类和减法类,继承运算类:

public class AddOperation extends Operation{

    @Override
    public double getResult(){
        return (num1+num2);
    }
}



public class SubOperation extends Operation{

    @Override
    public double getResult(){
        int num1 = super.num1;
        int num2 = super.num2;
        return (num1-num2);
    }
}

配置文件类:

重要:负责反射技术使用的配置部分

public class Config {
    String propertiesName;

    public Config(String propertiesName){
        this.propertiesName=propertiesName;
    }

    //在配置文件中写入键值对
    public void inData(String key,String value,String comments) throws IOException{
        //创建properties对象,以用于写入配置文件
        Properties props=new Properties();
        FileOutputStream oFile = new FileOutputStream(propertiesName,true);
        props.setProperty(key, value);
        props.store(oFile,comments);
        oFile.close();
    }

    //读取配置文件中的键值对
    public String outValue(String key) throws IOException{
        Properties props=new Properties();
        FileInputStream iFile=new FileInputStream(propertiesName);
        props.load(iFile);
        iFile.close();
        return props.getProperty(key);
    }
}

主函数(客户端):

public class Main {
    public static void main(String[] args) throws Exception {
        //初始化配置文件
        Config config = new Config("configA.properties");
        config.inData("+", "AddOperation","add");
        config.inData("-", "SubOperation","sub");

        //接受用户输入信息
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入运算数A");
        String num1 = scan.next();
        System.out.println("请输入运算数B");
        String num2 = scan.next();
        System.out.println("请输入运算符");
        String operate = scan.next();

        //根据用户输入信息,创建具体运算对象
        Operation oper = OperationFactory.createOperation(operate);
        //传入具体数字
        oper.setNum1(Integer.parseInt(num1));
        oper.setNum2(Integer.parseInt(num2));
        //输出结果
        System.out.println(oper.getResult()); 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值