精华内容
下载资源
问答
  • 享元模式

    2018-12-01 17:13:01
    享元模式

    享元模式基础

    享元模式 - Flyweight,是构造型模式之一,通过与其他类似对象共享数据来减少内存的占有情况。享元模式运用共享技术有效地支持大量细粒度的对象。也就是说,在一个系统中如果有多个相同的对象,那么只需要共享一份即可,而不必去实例化每一个对象。
    享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销一般就是内存开销。享元对象能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态是存储在享元对象内部的,并且是不会随环境的变化而变化的,因此,一个享元可以具有内蕴状态并可以共享;外蕴状态是随环境的改变而改变的,不可共享的,享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候在传入享元对象内部。外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。

    享元模式结构图

    享元模式
    享元模式设计的角色

    • 抽象享元角色
    • 具体享元角色
    • 复合享元角色
    • 享元工厂角色
    • 客户端角色

    单纯享元模式

    概念

    单纯享元模式,所有的享元对象都是可以共享的。
    单纯享元模式涉及的角色

    • 抽象享元角色
    • 具体享元角色
    • 享元工厂角色
    • 客户端角色

    实例

    咖啡问题

    1. 抽象享元角色
    public abstract class Caffee {
    
        /**
         * 卖咖啡
         */
        public abstract void sell();
    
    }
    
    1. 具体享元角色
    public class CaffeeProduct extends Caffee {
    
        private String product;
    
        public CaffeeProduct(String product){
            this.product = product;
        }
    
        public void sell(){
            System.out.println("HASHCODE: " + this.hashCode() + " -- SELL CAFFE: " + this.product + "!");
        }
    
    }
    
    1. 享元工厂角色
    public class CaffeeFactory {
    
        private final static String CaffeeMR= "CaffeeMR";
    
        private HashMap<String, Caffee> hashMap = new HashMap<>();
    
        private static CaffeeFactory caffeeFactory = new CaffeeFactory();
    
        private CaffeeFactory(){}
    
        public static CaffeeFactory getCaffeeFactory(){
            return caffeeFactory;
        }
    
        public Caffee getCaffee(String product){
            if(StringUtils.isBlank(product)){
                product =  CaffeeMR;
            }
            if(!hashMap.containsKey(product)){
                hashMap.put(product, new CaffeeProduct(product));
            }
            return hashMap.get(product);
        }
    
    }
    
    1. 客户端角色
    public class Client {
        public static void main(String[] args) {
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYG").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLYF").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeLQ").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeYHY").sell();
            CaffeeFactory.getCaffeeFactory().getCaffee("CaffeeMSS").sell();
    
        }
    }
    
    1. 测试结果
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    HASHCODE: 463345942 -- SELL CAFFE: CaffeeYG!
    HASHCODE: 195600860 -- SELL CAFFE: CaffeeLYF!
    HASHCODE: 1334729950 -- SELL CAFFE: CaffeeLQ!
    HASHCODE: 1347137144 -- SELL CAFFE: CaffeeYHY!
    HASHCODE: 997608398 -- SELL CAFFE: CaffeeMSS!
    

    复合享元模式

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,728
精华内容 3,891
关键字:

享元模式