zoukankan      html  css  js  c++  java
  • Java 享元模式(Flyweight)

    当一个应用中使用了大量的对象,这些对象造成了很大的存储开销,而对象的大部分状态或参数都是相同(内部状态)的时候,可以考虑使用享元模式,使用享元模式可以是这些对象引用都共享相同的实例,降低存储开销,而对象之间的不同的状态参数(外部状态)则使用外部参数传入来实现。

    package flyweight;
    
    public abstract class WebSite {
        protected String type;
        
        public WebSite(String type) {
            this.type = type;
        }
        
        public String getType() {
            return type;
        }
    
        public abstract void use(User user);
    }
    
    
    package flyweight;
    
    public class ConcurrentWebSite extends WebSite {
        public ConcurrentWebSite(String type) {
            super(type);
        }
    
        @Override
        public void use(User user) {
            System.out.println("The web site's type is: " + type);
            System.out.println("User: " + user.getUserName());
            System.out.println("Passwd: " + user.getPassWd());
            System.out.println();
        }
    }
    
    
    package flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class WebSiteFactory {
        private static Map<String, WebSite> webSites = new HashMap<String, WebSite>();
        
        private WebSiteFactory() {}
        
        public static WebSite createWebSite(String type) {
            WebSite webSite = webSites.get(type);
            if (webSite == null) {
                webSite = new ConcurrentWebSite(type);
                webSites.put(type, webSite);
            }
            return webSite;
        }
        
        public static int webSitesCount() {
            return webSites.size();
        }
    }
    
    
    package flyweight;
    
    public class User {
        private String userName;
        private String passWd;
        
        public User(String userName, String passWd) {
            this.userName = userName;
            this.passWd = passWd;
        }
        
        public String getUserName() {
            return userName;
        }
        
        public String getPassWd() {
            return passWd;
        }
    }
    
    
    package flyweight;
    
    public class Test {
        public static void main(String[] args) {
            WebSite wb1 = WebSiteFactory.createWebSite("BusinessWebSite");
            User user1 = new User("root", "root");
            wb1.use(user1);
            
            WebSite wb2 = WebSiteFactory.createWebSite("BusinessWebSite");
            User user2 = new User("admin", "admin");
            wb2.use(user2);
            
            WebSite wb3 = WebSiteFactory.createWebSite("BusinessWebSite");
            User user3 = new User("slave", "slave");
            wb3.use(user3);
            
            WebSite wb4 = WebSiteFactory.createWebSite("PersonalWebSite");
            User user4 = new User("person", "person");
            wb4.use(user4);
            
            WebSite wb5 = WebSiteFactory.createWebSite("PersonalWebSite");
            User user5 = new User("alexis", "alexis");
            wb5.use(user5);
            
            WebSite wb6 = WebSiteFactory.createWebSite("PersonalWebSite");
            User user6 = new User("shadow", "shadow");
            wb6.use(user6);
            
            System.out.println("WebSites Instances Count: " + WebSiteFactory.webSitesCount());
        }
    }

    输出

    The web site's type is: BusinessWebSite
    User: root
    Passwd: root

    The web site's type is: BusinessWebSite
    User: admin
    Passwd: admin

    The web site's type is: BusinessWebSite
    User: slave
    Passwd: slave

    The web site's type is: PersonalWebSite
    User: person
    Passwd: person

    The web site's type is: PersonalWebSite
    User: alexis
    Passwd: alexis

    The web site's type is: PersonalWebSite
    User: shadow
    Passwd: shadow

    WebSites Instances Count: 2

    这里我们共享的实例就是WebSite,type为内部参数,User作为外部参数传入。

  • 相关阅读:
    剑指offer编程题66道题 26-35
    剑指offer编程题66道题 1-25
    springboot的自动配置
    用智能的编译器来防错
    实现迭代器的捷径
    结束C#2的讲解:最后的一些特性
    进入快速委托通道
    可空类型
    用泛型实现参数化类型
    C#1所搭建的核心基础
  • 原文地址:https://www.cnblogs.com/zemliu/p/2775241.html
Copyright © 2011-2022 走看看