zoukankan      html  css  js  c++  java
  • 有关单例模式的使用方式

    早前一直对单例模式和静态工具类的功能重叠有些疑惑,昨天做了一个功能,忽然发现了一些单例可以实现但是静态工具类无法满足的需求。

    我有一个接口IAuthorization:

    View Code
    /**
     * 所有需要配置权限的功能块都必须实现本接口
     * 
     * @author caiyu
     * @date Nov 16, 2012 9:36:49 AM
     * 
     */
    public interface IAuthorization {
        // 权限开关 false有验证,true无验证
        public static final boolean open = false;
    
        String XML_NEW = "new";
        String XML_DELETE = "delete";
        String XML_MODIFY = "modify";
        String XML_DEPLOY = "deploy";
        String XML_COMPILE = "compile";
        String XML_SYNC = "sync";
        String XML_EXPORT = "export";
        String XML_EXPORT_DETAIL = "export_detail";
        String XML_BROWSE = "browse";
    
        String EXT_TCD = "tcd";
        String EXT_BCD = "bcd";
        String EXT_TRD = "trd";
        String EXT_TWF = "twf";
        String EXT_TMPL = "tmpl";
        String EXT_DICT = "dict";
        String EXT_F_PROJECT = "folder_project";
        String EXT_F_APPLICATION = "folder_application";
        String EXT_FPCK = "fpck";
        String EXT_NATP = "pck";
        /**
         * 注册权限委托
         * 
         * @return
         */
        IAuthDelegate registerDelegate();
    
        /**
         * 处理权限委托
         * 
         * @param delegate
         *            委托
         * @param selection
         * @return 是否具备权限
         */
        boolean handleDelegate(IAuthDelegate delegate, Object selection);
    }

    要使用权限管理的类必须实现该接口,现在我有两个编辑器(Editor)需要被权限管理,当没有编辑权限的时候,将该编辑器置为不可编辑状态。由于以后编辑器会不停的增加,所以需要使用一个通用的IAuthorization的工具类来实现权限管理。

    既然是工具类,那么就说明我们不需要多个实例,就应该使用单例或是或是静态工具类了。

    既然是实现自IAuthorization,就限定了该类的实现方法不能为static,于是单例模式应用就呼之欲出了。

    看看实现:

    ------------------------------------下面是SB的实现,不要看----------------------------

    public class PacketAuthManager implements IAuthorization {
        public final static PacketAuthManager INSTANCE;
        static{
            INSTANCE=new PacketAuthManager();
        }
        
        protected IActionAuthDelegate authDele;
       
        private String actionPermCode;
    
        private PacketAuthManager() {
            authDele = (IActionAuthDelegate) registerDelegate();
            actionPermCode = AuthCodeUtil.calculateActionPermCode(XML_MODIFY);
        }
    
        @Override
        public IAuthDelegate registerDelegate() {
            return AuthDelegateFactory.newDelegate(AuthDelegateFactory.TYPE_ACTION);
        }
    
        public boolean handleDelegate(String resource) {
            return handleDelegate(authDele, resource);
        }
    
        @Override
        public boolean handleDelegate(IAuthDelegate delegate, Object selection) {
            String resourceCode = null;
            if (selection instanceof String) {
                resourceCode = AuthCodeUtil
                        .calculateResourcePermCode((String) selection);
            }
            delegate.setPermIDs(new String[] { AuthCodeUtil.calculatePermissionId(
                    actionPermCode, resourceCode) });
            AuthController.getInstance().handleDelegate(delegate);
            return ((IActionAuthDelegate) delegate).isActionEnabled() || open;
        }
    
    }

     -----------------------------------后面才是正确的实现------------------------------------------

    /**
     * 通用SQL类型工具
     * 
     * @author caiyu
     * @date 2013 2013-7-15 上午10:54:17
     */
    public final class GenericSqlTypeUtil {
        private static GenericSqlTypeUtil INSTANCE;
        private final static String TEMPLATE = "/genericSqlType.xml";
        private final Map<String, String> genericSqlTypeCache;
    
        private GenericSqlTypeUtil() {
            genericSqlTypeCache = new HashMap<String, String>();
            init();
        }
    
        /**
         * 初始化
         */
        private void init() {
            SAXReader reader = null;
            Document doc = null;
            InputStream is = null;
            try {
                is = FileLocator.openStream(Activator.getDefault().getBundle(),
                        new Path(TEMPLATE), false);
                // is = new FileInputStream(TEMPLATE);
                reader = new SAXReader();
                doc = reader.read(is);
                // TODO
                // 对genericSqlTypeCache做初始化,genericSqlTypeCache的KEY为取自name,VALUE取自desc
                Element root = doc.getRootElement();
                List<?> list = root.elements("type");
                for (Object o : list) {
                    Element element = (Element) o;
                    String name = element.attributeValue("name");
                    String desc = element.elementText("desc");
                    genericSqlTypeCache.put(name, desc);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e) {
                e.printStackTrace();
            } finally {
                if (reader != null)
                    reader.resetHandlers();
                if (doc != null)
                    doc.clearContent();
                if (is != null)
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
        }
    
        /**
         * 根据通用的SQL类型名称获取类型描述
         * 
         * @param genericSqlTypeName
         *            参考java.sql.Types
         * @return
         */
        public String getSqlTypeDescription(String genericSqlTypeName) {
            return genericSqlTypeCache.get(genericSqlTypeName);
        }
    
        public static GenericSqlTypeUtil getInstance() {
            if (INSTANCE == null)
                INSTANCE = new GenericSqlTypeUtil();
            return INSTANCE;
        }
    }
  • 相关阅读:
    《活着》--余华
    《麦田里的守望者》--[美]杰罗姆·大卫·塞林格
    《平凡的世界》--路遥
    彩色照片转换为黑白照片(Color image converted to black and white picture)
    《戴尔·卡耐基传记》--[美]戴尔·卡耐基
    Maven的第一个小程序
    C# RabbitMQ优先级队列实战项目演练
    控制WinForm中Tab键的跳转
    C#模板引擎NVelocity实战项目演练
    C#隐藏手机号中间四位为*
  • 原文地址:https://www.cnblogs.com/anrainie/p/2512802.html
Copyright © 2011-2022 走看看