【设计模式】6-10:装饰器模式、代理模式、工厂模式、原型模式、模板方法模式
第六章 装饰器模式
类的行为或其算法可以在运行时更改,属于行为型模式
应用:不同实现类的功能不同,一个策略结构,一个上下文类(接口参数),n个接口实现类
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
第七章 代理模式
在访问一个类时做一些控制,通过代理实现对类的访问和控制
实现与被代理类方法的组合,为空时赋值再执行……
包含:接口、实现类、代理类,测试时父类引用(接口)指向子类对象
public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }
第八章 工厂模式
创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
实例化工厂类,根据传入的参数,生成对应实体类的对象
使用工厂类返回指定的子类
用途:日志记录、数据库访问
public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
调用
ShapeFactory shapeFactory = new ShapeFactory(); //获取 Circle 的对象,并调用它的 draw 方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.draw();
与简单工厂模式的区别:简单工厂模式是在测试类中进行选择判断,而工厂模式是编写工厂类,在工厂类中返回指定的对象
第九章 原型模式
用于创建重复的对象,同时又能保证性能,属于创建型模式
实现Cloneable接口,其clone方法用于创建当前对象的克隆
implements Cloneable public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; }
根据key字符串的id,存入hashmap方法,从map中取值,返回对应对象的方法
第十章 模板方法模式
抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
场景:有多个子类公用的方法,且逻辑相同
注意:一般模板方法都加上 final 关键词,以防止恶意操作
缺陷:多个子类均需要定义自己的子类实现,比较复杂
public abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); //模板 public final void play(){ //初始化游戏 initialize(); //开始游戏 startPlay(); //结束游戏 endPlay(); } }
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15787150.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-01-11 【Java SE】Day01 前言、入门程序、常量、变量
2021-01-11 基于人脸识别的登录与注册
2021-01-11 Java中遇到的常见问题