zoukankan      html  css  js  c++  java
  • 设计模式 | 享元模式(Flyweight)

    定义:

    运用共享技术有效地支持大量细粒度的对象。

    结构:(书中图,侵删)

    一个享元工厂类
    一个抽象享元类
    若干需要共享的享元子类
    若干不需要共享的享元子类
     
    这里要说两个概念:
    内部状态:共享类内部的叫内部状态
    外部状态:不在共享类内部的叫外部状态

    实例:

    享元模式的意义就是使相同或相似的对象共享同一个对象,从而起到节省资源的作用。
    书中用到的例子是帮人做网站,很多客户的需求其实是差不多的,但是为每个客户都新建虚拟机,复制一套一套代码,是很浪费资源的事情。
    而且一旦有Bug或者需求要修改,工作量也是巨大的,完全可以共享对象。
    我想起了自己上大学那会也帮人做过网站,后来人家又介绍了生意过来,我因为上班比较忙就拒绝了,要是早点把设计模式学好,说不定都财富自由了(狗头)
     
    下面的实例用书中提到的另外一个围棋的例子吧。
    围棋的棋子都是一样的,只是颜色和位置不同。
     
    抽象棋子接口:
    package designpattern.flyweight;
    
    public interface Chessman {
        abstract void position(String position);
    }

    具体棋子类:

    package designpattern.flyweight;
    
    public class ConcreteChessman implements Chessman {
        String color;
    
        public ConcreteChessman(String color) {
            this.color = color;
        }
    
        @Override
        public void position(String position) {
            System.out.println(color + "棋下在:" + position);
        }
    
    }

    棋子工厂类:

    package designpattern.flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class ChessmanFactory {
        Map<String, Chessman> map = new HashMap<>();
    
        public Chessman getChessman(String color) {
            if (map.containsKey(color)) {
                return map.get(color);
            } else {
                Chessman chessman = new ConcreteChessman(color);
                map.put(color, chessman);
                return chessman;
            }
        }
    }

    客户端:

    package designpattern.flyweight;
    
    public class Client {
        public static void main(String[] args) {
            ChessmanFactory factory=new ChessmanFactory();
            Chessman cc1= factory.getChessman("黑");
            cc1.position("右上星位");
            
            Chessman cc2= factory.getChessman("白");
            cc2.position("天元");
            
            Chessman cc3= factory.getChessman("黑");
            cc3.position("右上目外");
        }
    }

    结果输出:

    黑棋下在:右上星位
    白棋下在:天元
    黑棋下在:右上目外

    总结:

    不知道该总结些什么了,直接上书中的内容吧:

     

    上面的后半句我没太看明白,所以留给大家自己理解吧。

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/imoqian/p/13974400.html
Copyright © 2011-2022 走看看