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("右上目外");
        }
    }

    结果输出:

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

    总结:

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

     

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

  • 相关阅读:
    检验maven的配置是否生效或正确。
    CTO、技术总监和技术经理有啥区别?
    WinScp自动执行脚本
    宝塔--服务器运维面板
    Tomcat中给server.xml加入<Context>元素
    Tomcat之Session名称修改-springboot
    修改tomcat默认的session时间
    Shiro权限框架简单快速入门
    mybatis关联查询
    <mvc:default-servlet-handler/>导致controller失效,报404错误
  • 原文地址:https://www.cnblogs.com/imoqian/p/13974400.html
Copyright © 2011-2022 走看看