【设计模式】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