软件编程
位置:首页>> 软件编程>> java编程>> Java设计模式之享元模式示例详解

Java设计模式之享元模式示例详解

作者:温故知新之java  发布时间:2022-12-08 22:19:46 

标签:Java,设计模式,享元模式

定义

享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。

原理类图

Java设计模式之享元模式示例详解

  • Flyweight :抽象的享元角色,他是抽象的产品类,同时他会定义出对象的内部状态和外部状态

  • ConcreteFlyweight :是具体的享元角色,具体的产品类,实现抽象角色,实现具体的业务逻辑

  • UnsharedConcreteFlyweight :不可共享的角色,这个角色也可能出现在享元模式中

  • FlyweightFactory :享元工厂类,用于构建一个池的容器,同时在享元工厂里会提供公共方法 (从池子里获取对象,获取池子里的对象总数,根据key获取对象,,)

  • Client:客户端了,使用享元模式去完成业务逻辑

案例

需求

我们接了一个小型的外包项目,给客户老王做一个产品展示网页,老王的朋友们感觉效果不错,也希望做这样的产品展示网页,但是他们要求都有些不同

1)有客户要求网页以新闻的形式发布

2)有客户要求网页以博客的形式发布

3)有客户希望网页以微信公众号的形式发布

方案:享元模式

定义网站用户类

public class User {
   private String name;

public User(String name){
       this.name = name;
   }

public String getName() {
       return name;
   }

public void setName(String name) {
       this.name = name;
   }
}

定义网站抽象类——享元角色

public abstract class Website {
   public abstract void show(User user);
}

定义具体的网站类——具体的享元角色

public class ConcreteWebsite extends Website{
   // 网站的发布形式
   private String type;

public ConcreteWebsite(String type){
       this.type = type;
   }

@Override
   public void show(User user) {
       System.out.println("以" + type + "形式发布网站");
       System.out.println("网站的用户名是:" + user.getName());
   }
}

定义网站工厂类——享元工厂类

public class WebsiteFactory {
   // 创建HashMap,充当池的角色
   private HashMap<String, ConcreteWebsite> pool = new HashMap<String, ConcreteWebsite>();

// 根据类型判断,获取池子里的对象
   public Website getWebsite(String type){
       if(!pool.containsKey(type)){
           pool.put(type,new ConcreteWebsite(type));
       }
       return pool.get(type);
   }

// 获取池子里的对象总数
   public int getWebsiteCount(){
       System.out.println("当前池子里的对象总数:" + pool.size());
       return pool.size();
   }
}

定义客户端测试类

public class Client {
   public static void main(String[] args) {
       //创建一个享元工厂
       WebsiteFactory websiteFactory = new WebsiteFactory();
       Website news = websiteFactory.getWebsite("新闻");
       news.show(new User("老李"));
       Website wechat = websiteFactory.getWebsite("博客");
       wechat.show(new User("老高"));
       websiteFactory.getWebsiteCount();
       Website wechat1 = websiteFactory.getWebsite("微信");
       wechat.show(new User("老沈"));
       websiteFactory.getWebsiteCount();
   }
}

查看测试结果

Java设计模式之享元模式示例详解

分析

通过一个工厂类来根据不同类型的需求,从而生成对应的具体的享元对象,实现了需求。其中享元对象的信息分为两个部分,内部状态和外部状态。内部对象是指对象共享出来的信息,存储在享元对象内部,不随着环境的改变而改变,外部对象随着环境的改变而改变,不可共享的状态。

来源:https://juejin.cn/post/7070753861761253406

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com