模式扩展 ——简单工厂+配置文件解除耦合 *****
简单工厂+配置文件解除耦合
可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。
在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。
第一步:定义配置文件
为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties
american=com.itheima.pattern.factory.config_factory.AmericanCoffee
latte=com.itheima.pattern.factory.config_factory.LatteCoffee
Coffee.java
package com.itheima.pattern.factory.config_factory;/*** @version v1.0* @ClassName: Coffee* @Description: 咖啡类* @Author: dym*/
public abstract class Coffee {public abstract String getName();//加糖public void addsugar() {System.out.println("加糖");}//加奶public void addMilk() {System.out.println("加奶");}
}
LatteCoffee.java
package com.itheima.pattern.factory.config_factory;/*** @version v1.0* @ClassName: LatteCoffee* @Description: 拿铁咖啡* @Author: dym*/
public class LatteCoffee extends Coffee {public String getName() {return "拿铁咖啡";}
}
AmericanCoffee.java
package com.itheima.pattern.factory.config_factory;/*** @version v1.0* @ClassName: AmericanCoffee* @Description: 美式咖啡* @Author: dym*/
public class AmericanCoffee extends Coffee {public String getName() {return "美式咖啡";}
}
CoffeeFactory.java
package com.itheima.pattern.factory.config_factory;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;/*** @version v1.0* @ClassName: CoffeeFactory* @Description: TODO(一句话描述该类的功能)* @Author: dym*/
public class CoffeeFactory {//加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储//1,定义容器对象存储咖啡对象private static HashMap<String,Coffee> map = new HashMap<String, Coffee>();//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集合中获取全类名并创建对象Set<Object> keys = p.keySet();for (Object key : keys) {String className = p.getProperty((String) key);//通过反射技术创建对象Class clazz = Class.forName(className);Coffee coffee = (Coffee) clazz.newInstance();//将名称和对象存储到容器中map.put((String)key,coffee);}} catch (Exception e) {e.printStackTrace();}}//根据名称获取对象public static Coffee createCoffee(String name) {return map.get(name);}
}
Client.java
package com.itheima.pattern.factory.config_factory;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句话描述该类的功能)* @Author: dym*/
public class Client {public static void main(String[] args) {Coffee coffee = CoffeeFactory.createCoffee("american");System.out.println(coffee.getName());System.out.println("=============");Coffee latte = CoffeeFactory.createCoffee("latte");System.out.println(latte.getName());}
}
静态成员变量用来存储创建的对象(键存储的是名称,值存储的是对应的对象),
而读取配置文件以及创建对象写在静态代码块中,目的就是只需要执行一次。
模式扩展 ——简单工厂+配置文件解除耦合 *****相关推荐
- Java工厂模式(简单工厂、工厂方法、抽象工厂)详解
工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式.在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象. 1.工厂模式的理解 1.1.工厂模式的分类 工厂模 ...
- 设计模式——工厂模式(简单工厂/工厂/抽象)
1. 简单工厂模式 1.1 定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模 ...
- 工厂模式(简单工厂模式)快速理解
工厂模式 一个工厂类根据传入的参数,动态的决定应该创建哪一个产品类(产品类都继承或实现于一个父类或接口),自动创建并返回实例 使用场景 工厂类负责创建的对象较少,调用者只知道传入参数,对于如何创建对象 ...
- 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图
本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...
- 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- 工厂模式(简单工厂、工厂方法、抽象工厂)
简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...
- 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
最新文章
- Fortinet“安立方”架构获得NSS Labs BDS 组测试多攻击维度100%检出率佳绩
- 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
- 牛客网(剑指offer) 第七题 斐波那契数列
- TextView控件
- 商桥物流完成达晨创投领投2.5亿元A+轮融资,创建立体化零担物流网络
- Oracle数据库只读事务和无事务的区别
- 李迟2021年11月知识总结
- docker-compose的一些理解
- Exchange 2016通过IIS限制不允许访问OWA的域名或网段
- java中的构造函数
- 分布式日志收集系统实践(视频教程)
- MAX30102学习笔记(下)
- 参数问题:nested exception is java.lang.NumberFormatException: For input string: “null“,已解决。
- 公钥,私钥 和数字证书
- 黑客电影预言或成真,英国核潜艇安全问题堪忧
- 链路层链路发现协议(LLDP)讲解
- 看了下大厂程序员的工资表,我酸了.....
- opengles绘制天空盒
- dhu 1.2 链表的中间结点
- 小程序用户头像昵称获取规则调整公告及微信小程序基础库的问题