当前位置: 首页 > article >正文

Java设计模式——工厂模式扩展

5.5 工厂模式扩展

简单工厂+配置文件解除耦合

(spring底层类似)

可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并通过反射技术创建对象进行存储,客户端如果需要对象,直接进行获取即可。

为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties,配置文件内容如下:

american=factory.config_factory.AmericanCoffee
latte=factory.config_factory.LatteCoffee

#如果冰咖啡饮品,直接添加全类名即可,咖啡工厂中代码不用修改
icecoffee =factory.config_factory.IceCoffee
//咖啡工厂
public class CoffeeFactory {

    //加载配置文件,获取配置文件中配置的全类名,并创建全类名的类的对象进行存储

    // 1.定义容器存储咖啡对象
    private static Map<String,Coffee> map = new HashMap();

    // 2.静态代码块 加载配置文件,只需加载一次
    static {
        // 2.1创建Properties对象
        Properties p = new Properties();
        // 2.2调用p对象中的load方法进行配置文件的加载
        InputStream is = 
                     CoffeeFactory.class
                    .getClassLoader()
                    .getResourceAsStream("bean.properties");
        try {
            p.load(is);
            //从p集合中获取全名并创建对象
            //遍历Properties集合对象
            Set<Object> keys = p.keySet();
            for (Object key : keys) {
                //根据键获取值(全类名)
             String className = p.getProperty((String) key);
                // 通过反射技术创建对象
                //获取字节码对象
                Class clazz = Class.forName(className);
                Coffee obj = (Coffee) clazz.newInstance();
                map.put((String)key,obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 根据名称获取对象
    public static Coffee createCoffee(String name) {
        return map.get(name);
    }

}
============================================================
// 咖啡类(父类)
public abstract class Coffee {
    public abstract String getName();

    public void addMilk(){
        System.out.println("加奶...");
    }

    public void addSugar(){
        System.out.println("加糖...");
    }
}
=================================================
  // 美式咖啡类
public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }

    public void show(){
        System.out.println("我是美式咖啡....");
    }
}
================================================
  // 拿铁咖啡类
public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}
=======================================================
  //新增冰咖啡饮品,咖啡工厂类不用修改
public class MiXue extends Coffee{
    @Override
    public String getName() {
        return "冰咖啡";
    }
}
==================================================
  public class Test {
    public static void main(String[] args) {

        //直接通过配置文件中对应的美式咖啡名字 获取美式咖啡对象
   Coffee american = CoffeeFactory.createCoffee("american");
        american.addMilk();
        american.addSugar();
        System.out.println(american.getName());

       //直接通过配置文件中对应的冰咖啡名字 获取冰咖啡对象
        //新增冰咖啡
 Coffee icecoffee = CoffeeFactory.createCoffee("icecoffee");
        icecoffee.addSugar();
        icecoffee.addMilk();
        System.out.println(icecoffee.getName());

    }
}

http://www.kler.cn/a/322486.html

相关文章:

  • 力扣-Mysql-3322- 英超积分榜排名 III(中等)
  • 【git】git取消提交的内容,恢复到暂存区
  • uniapp微信小程序转发跳转指定页面
  • 【服务器组件】如何辨别服务器组件
  • Python 人脸检测:使用 Dlib 和 OpenCV
  • PgSQL汇总
  • 算法打卡:第十一章 图论part02
  • 2024年Oceanbase考试认证的习题以及注意事项
  • 基于SpringBoot+Vue+MySQL的医院信息管理系统
  • 系统架构笔记-2-计算机系统基础知识
  • 数据处理与统计分析篇-day11-RFM模型案例
  • CANopen开源库canfestival的移植
  • ARM单片机的内存分布(重要)
  • 碳性电池和碱性电池的区别
  • 【中级通信工程师】终端与业务(九):市场细分与选择
  • Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】
  • windows控制台ssh登录(ssh远程登录)(ssh连接ssh、直连ssh直连、cmd连接ssh)控制台连接ssh
  • 18.2 k8s-apiserver监控源码解读
  • 【移植】Combo解决方案之W800芯片移植案例
  • YOLOv8改进 - 注意力篇 - 引入(A2-Nets)Double Attention Networks注意力机制
  • 【machine learning-17-分类(逻辑回归sigmod)】
  • ‌股市大涨,科技股受捧,机器视觉行业有望迎来新一轮大批量投资,拉动内需消费,促进大量高薪员工
  • 使用LSTM模型进行时间序列数据预测的示例
  • 代码随想录算法训练营Day10
  • 611. 有效三角形的个数
  • 【d52】【Java】【力扣】19.删除链表的倒数第N个节点