设计模式_22:享元模式
来源:互联网 发布:lua 人工智能 编辑:程序博客网 时间:2024/05/22 13:24
书上的原句:
享元模式:运用共享技术有效地支持大量细粒度的对象。
栗子来了:
我们写了一个网站,现在要把这个产品卖给不同的用户,但为了节省资源,我们可以把相同类型的网站公用一个服务器和数据库,而不用重新购买服务器和申请多个域名了(也就是不用重复new同类别的对象)。
import java.util.HashMap;import java.util.Map;public class Main { public static void main(String[] args) { WebsiteFactory factory = new WebsiteFactory(); AbstractWebsite lt1 = factory.getWebsite("论坛"); lt1.use(); AbstractWebsite lt2 = factory.getWebsite("论坛"); lt2.use(); AbstractWebsite lt3 = factory.getWebsite("论坛"); lt3.use(); AbstractWebsite bk1 = factory.getWebsite("博客"); bk1.use(); AbstractWebsite bk2 = factory.getWebsite("博客"); bk2.use(); System.out.println("网站分类总数:" + factory.getWebsiteCount()); }}//抽象网站abstract class AbstractWebsite { abstract void use();}//具体网站class Website extends AbstractWebsite { private String name; public Website(String name) { this.name = name; } @Override void use() { System.out.println("网站分类:" + name); }}//网站工厂类class WebsiteFactory { private Map<String, AbstractWebsite> flyweights = new HashMap<>(); public AbstractWebsite getWebsite(String key){ //只有key不存在的情况下才会new对象 if (!flyweights.containsKey(key)){ flyweights.put(key, new Website(key)); } return flyweights.get(key); } //获取实际网站的个数 public int getWebsiteCount(){ return flyweights.size(); }}
运行结果:
网站分类:论坛网站分类:论坛网站分类:论坛网站分类:博客网站分类:博客网站分类总数:2
可以看到,我们卖给用户5个网站,其实只要写两个网站就行了。
但一般情况下我们的网站是不会一模一样的,例如用户数据等,因此遇到这种情况,我们可以用外界的参数传入实现:
import java.util.HashMap;import java.util.Map;public class Main { public static void main(String[] args) { WebsiteFactory factory = new WebsiteFactory(); AbstractWebsite lt1 = factory.getWebsite("论坛"); lt1.use(new User("小鸟")); AbstractWebsite lt2 = factory.getWebsite("论坛"); lt2.use(new User("大鸟")); AbstractWebsite lt3 = factory.getWebsite("论坛"); lt3.use(new User("菜鸟")); AbstractWebsite bk1 = factory.getWebsite("博客"); bk1.use(new User("弱鸡")); AbstractWebsite bk2 = factory.getWebsite("博客"); bk2.use(new User("大大")); System.out.println("网站分类总数:" + factory.getWebsiteCount()); }}class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; }}abstract class AbstractWebsite { abstract void use(User user);}class Website extends AbstractWebsite { private String name; public Website(String name) { this.name = name; } //参数User从这里传入 @Override void use(User user) { System.out.println("网站类别:" + name + " 用户:" + user.getName()); }}class WebsiteFactory { private Map<String, AbstractWebsite> flyweights = new HashMap<>(); public AbstractWebsite getWebsite(String key){ if (!flyweights.containsKey(key)){ flyweights.put(key, new Website(key)); } return flyweights.get(key); } public int getWebsiteCount(){ return flyweights.size(); }}
运行结果:
网站类别:论坛 用户:小鸟网站类别:论坛 用户:大鸟网站类别:论坛 用户:菜鸟网站类别:博客 用户:弱鸡网站类别:博客 用户:大大网站分类总数:2
阅读全文
0 0
- 设计模式_22:享元模式
- 迭代器模式(设计模式_22)
- 设计模式---享元模式
- 设计模式 享元模式
- 设计模式 - 享元模式
- 设计模式:享元模式
- 设计模式 - 享元模式
- 设计模式-享元模式
- 设计模式---------享元模式
- 设计模式:享元模式
- 设计模式--享元模式
- 设计模式-享元模式
- 设计模式:享元模式
- 设计模式-享元模式
- 设计模式--享元模式
- 设计模式--享元模式
- 设计模式--享元模式
- 设计模式-享元模式
- 做三级联动时出现的问题
- Switf运算符重载
- 实际工作中的常见测试方法
- 刚刚装了php7 nginx下有多个php版本,怎么选择使用哪一个?
- 安卓开发小技巧
- 设计模式_22:享元模式
- C++ 拷贝构造函数
- swift中UITabBarController中的使用
- 学Linux的第一天
- 12.Java内存模型与线程
- vsftpd-3.0.2 移植 ARM板
- 进程间通讯——信号量
- 数据库——Oracle中创建视图
- AngularJS在页面对表格进行增加、查询、排序