• 【软件设计】工厂模式之反射技术+读取配置文件


    一、实验目的

    1. 理解面向对象设计原则和常用设计模式;
    2. 理解并掌握工厂模式的概念和实现;
    3. 理解并掌握抽象工厂模式的概念和实现;
    4. 理解用反射技术+配置文件对工厂模式进行改进的方法

    二、工厂模式实验

    利用“反射技术+读取配置文件”的方法对简易计算器程序做改进

    1、工厂模式与简单工厂模式的区别

    简单工厂模式:一个工厂创建多个产品
    工厂模式:每个产品都有对应的工厂进行生产,使用Factory模式替代new创建对象
    抽象工厂模式:使用迭代模式创建对象

    2、Properties类(介绍)

    java中提供了配置文件的操作类Properties,Properties常用方法:

    //设置properties键值对
    properties.setProperty(String key, String value);
    
    //获取properties值
    properties.getProperty(String key);
    
    //从输入流中读取属性列表(键值对)
    properties.load(InputStream inStream);
    properties,load(new FileInputStream("路径")
    //按简单的面向行的格式从输入字符流中读取属性列表(键值对)
    properties.load(Reader reader);
    
    //将XML文档所表示的所有属性加载到properties中
    properties.loadFromXML(InputStream in);
    
    //以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键值对)写入输出流
    properties.store(OutputStream out, String comments);
    
    //以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键值对)写入输出字符
    properties.store(Writer writer, String comments);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3、总结:通过读取配置文件的形式可以实现代码的深层次解耦,在java编程中,配置文件的重要性更是不言而喻。java编程有一条不成文的规定就是:“约定大于配置,配置大于代码”意思就是能用约定的就不去配置,能用配置文件搞定的就不去写代码。

    4、代码

    IFactory.java
    package pac01;
    
    interface IFactory {
        Operation createOperation(String A,String B);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    FactoryAdd.java
    package pac01;
    class FactoryAdd implements IFactory {
        @Override
        public Operation createOperation(String A,String B) {
            return new OperationAdd();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    FactoryDiv.java
    package pac01;
    class FactoryDiv implements IFactory{
        @Override
        public Operation createOperation(String A,String B) {
            return new OperationDiv();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    FactoryMul.java
    package pac01;
    class FactoryMul implements IFactory {
        @Override
        public Operation createOperation(String A,String B) {
            return new OperationMul();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    FactorySub.java
    package pac01;
    class FactorySub implements IFactory {
        @Override
        public Operation createOperation(String A,String B) {
            return new OperationSub();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    Properties.java
    package io;
    import java.io.InputStream;
    
    public class Properties {
        public static void main (String[] args){
    //        获取class的包装类class
            Class propertiesClass =  Properties.class;
    
    //        类加载器类:负责加载类的对象
            ClassLoader classLoader = propertiesClass.getClassLoader();
    
    //        get得到资源作为文件流 (获取文件流)
            InputStream inputStream = classLoader.getResourceAsStream("jdb.properties");
    
            //        System.out.println(inputStream);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    jdbc.properties
    +=pac01.FactoryAdd
    -=pac01.FactorySub
    *=pac01.FactoryMul
    /=pac01.FactoryDiv
    
    • 1
    • 2
    • 3
    • 4
    Test.java
    package pac01;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    import java.util.Scanner;
    
    public class Test{
            public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
                    try {
                            Scanner input = new Scanner(System.in);
                            System.out.print("请输入数字A: ");
                            String strNumberA = input.nextLine();
                            System.out.print("请输入+-*/: ");
                            String strType = input.nextLine();
                            System.out.print("请输入数字B: ");
                            String strNumberB = input.nextLine();
                            Properties properties = new Properties();
                            InputStream is = new FileInputStream(new File("src/jdbc.properties"));
                            properties.load(is);
                            is.close();
                            String className = properties.getProperty(strType);
                            IFactory factory = (IFactory) Class.forName(className).newInstance();
                            Operation oper = factory.createOperation(strNumberA,strNumberB);
                            System.out.println("结果为" + oper.getResult(strNumberA, strNumberB));
                    } catch (Exception e) {
                            System.out.println("除数不能为零");
                    }
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    其余代码与上期相同,详见软件工程综合实践】工厂模式之简易四则运算器(完整代码)

    请添加图片描述
    请添加图片描述

    三、蛋糕店升级版

    1、Diagrams

    请添加图片描述

    2、代码

    BananaCakeFactory.java
    public class BananaCakeFactory implements IFactory{
        @Override
        public Cake createCake(String type){
            return new BananaCake();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    CheeseCakeFactory.java
    class CheeseCakeFactory implements IFactory{
        @Override
        public Cake createCake(String type){
            return new CheeseCake();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    ChocolateCakeFactory.java
    class ChocolateCakeFactory implements IFactory{
        @Override
        public Cake createCake(String type){
            return new ChocolateCake();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    LemonCakeFactory、StrawberryCakeFactory类似

    IFactory.java
    interface IFactory {
        Cake createCake(String type);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    cake.properties
    Strawberry=pac01.StrawberryCake
    Lemon=pac01.LemonCake
    Banana=pac01.BananaCake
    Chocolate=pac01.ChocolateCake
    Cheese=pac01.CheeseCake
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    BananaCake.java
    package pac01;
    public class BananaCake extends Cake {
        @Override
        public void addMilk() {
            System.out.println("给蛋糕加牛奶!");
        }
        @Override
        public void addFlour() {
            System.out.println("给蛋糕加面粉!");
        }
        @Override
        public String getName() {
            return "香蕉蛋糕";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    CheeseCake.java
    package pac01;
    public class CheeseCake extends Cake{
        @Override
        public void addMilk() {
            System.out.println("给蛋糕加牛奶!");
        }
        @Override
        public void addFlour() {
            System.out.println("给蛋糕加面粉!");
        }
        @Override
        public String getName() {
            return "芝士蛋糕";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    ChocolateCake.java
    package pac01;
    public class ChocolateCake extends Cake{
        @Override
        public void addMilk() {
            System.out.println("给蛋糕加牛奶!");
        }
        @Override
        public void addFlour() {
            System.out.println("给蛋糕加面粉!");
        }
        @Override
        public String getName() {
            return "巧克力蛋糕";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    Client.java
    package pac01;
    
    import sun.security.krb5.internal.crypto.CksumType;
    import java.io.*;
    import java.util.Properties;
    import java.util.Scanner;
    public class Client {
        public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
            Scanner input =new Scanner(System.in);
            CakeStore cakeStore = new CakeStore();
            cakeStore.welcome();
    
            String type = input.nextLine();
    
            Properties properties = new Properties();
            InputStream is = new FileInputStream(new File("src/cake.properties"));
            properties.load(is);
            is.close();
            String className = properties.getProperty(type);
            IFactory factory = (IFactory) Class.forName(className).newInstance();
            Cake cake = factory.createCake(type);
            cake.addMilk();
            cake.addFlour();
            System.out.println(cake.getName(type)+"新鲜出炉~");
            cakeStore.goodbye();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    面试 Python 基础八股文十问十答第七期
    猿创征文|我的前端——【HTML5】基础成长学习之路
    四氯四碘荧光素二钾,CAS号: 632-68-8
    【第3天】SQL快速入门-高级查询(SQL 小虚竹)
    软件企业找第三方软件测评机构做确认测试有什么优势?
    动态环境下的语义SLAM算法
    基于BERT模型进行文本处理(Python)
    用户态与内核态
    vue-project-01
    requests从一个链接下载存放在临时文件tempfile,python
  • 原文地址:https://blog.csdn.net/weixin_51293984/article/details/126879975