模式的秘密--工厂模式
模式 -- 工厂 秘密
2023-09-14 08:58:42 时间
工厂模式概念:
- 实例化对象,用工厂方法代替new操作
- 工厂模式包括工厂方法模式和抽象工厂模式
- 抽象工厂模式是工厂方法模式的扩展
工厂模式的意图:
- 定义一个接口创建对象,但是让子类决定哪些类需要被实例化。
- 工厂方法把实例化的工作推迟到子类去实现。
什么情况下适合工厂模式
- 有一组类似的对象需要创建。
- 在编码时候不能预见需要创建哪种类的实例。
- 系统需要考虑扩展性,不应依赖于产品类实例如何被创建,组合和表达的细节。
工厂模式的动机
项目中的现状:
软件系统中经常面临对象的创建工作,由于需求的变化,这个对象可能也随之发生变化,但他却拥有比较稳定的接口。
为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随之需求变化而变化。
基于项目现状将代码进行如下设计:
1,尽量松耦合,一个对象的依赖对象的变化与本身无关。
2,具体产品与客户端剥离,责任分割。
项目:
说明:
实现代码:
先定义一个接口:发型接口:
package com.Factory; /* * 发型接口 * */ public interface HairInterface { //实现了发型 public void draw(); }
定义两个实现类:
package com.Factory; public class LeftHair implements HairInterface { /* * 画了一个左偏分发型 * */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("----------实现了左偏发型------------"); } }
和
package com.Factory; public class RightHair implements HairInterface { /* * 画了一个右偏分发型 * */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("----------实现了右偏分发型------------"); } }
测试:不使用工厂的实现方式:
package com.Factory; /* * 模拟客户端实现 * */ public class SunnyTest { public static void main(String[] args) { //不用工厂的方式实现 HairInterface left=new LeftHair(); left.draw(); } }
这种方式很麻烦。
可以通过工厂模式解决:
工厂类:分别用普通的工厂类和通过反射实现的工厂类实现。
package com.Factory; /* * 发型工厂 * */ public class HairFactory { //普通的工厂方式 public HairInterface getHair(String key) { if("left".equals(key)) { return new LeftHair(); } else if("Right".equals(key)) { return new RightHair(); } return null; } /* * 通过反射实现工厂 * 根据类的名称来生产对象 * */ public HairInterface getHairByClass(String className) { try { HairInterface hair=(HairInterface)Class.forName(className).newInstance(); return hair; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
分别用三种方式实现:
package com.Factory; /* * 模拟客户端实现 * */ public class SunnyTest { public static void main(String[] args) { //不用工厂的方式实现 HairInterface left=new LeftHair(); left.draw(); //使用普通工厂的方式 HairFactory factory=new HairFactory(); HairInterface left2=factory.getHair("left"); left2.draw(); //使用反射实现的工厂 HairInterface right=factory.getHairByClass("com.Factory.RightHair"); right.draw(); } }
---恢复内容结束---
相关文章
- android activity singletask,Android Activity启动模式之singleTask实例详解
- 三、责任链模式
- 十六、备忘录模式
- Zookeeper单机模式启动
- Go学设计模式--原型模式的考查点和使用推荐
- 本站同款宁静致远(Quietlee)自媒体博客主题模板,夜间模式及强大的SEO效果-ZBlog主题
- 使用 Web3.py 模式进行定制化
- Go 函数式编程篇(六):引入 Map-Reduce-Filter 模式处理集合元素
- 一起学习设计模式--02.简单工厂模式
- 一起学习设计模式--06.建造者模式
- 创建型模式--设计模式详解?
- Java抽象工厂模式的使用方法
- 【Unity3D】Unity 脚本 ⑤ ( 编辑模式与播放模式 )
- 拒绝白嫖!开源模式的反击:向不要脸的云服务商收费!
- 设计模式之访问者模式(行为型)详解架构师
- Oracle模式下的导出数据操作(oracle模式导出)
- 交互深入Linux命令行:如何退出Less交互模式(linux退出less)
- DevOps 思维模式的 5 个基本价值观
- MSSQL 进入紧急救援模式(mssql 紧急模式)
- Oracle模式一切皆可管理(oracle什么是模式下)
- 利用Redis实现的挖矿新模式(利用redis 挖矿)
- PHP设计模式之观察者模式介绍
- php利用单例模式实现日志处理类库