有关单例模式的使用方式

简介: 早前一直对单例模式和静态工具类的功能重叠有些疑惑,昨天做了一个功能,忽然发现了一些单例可以实现但是静态工具类无法满足的需求。   我有一个接口IAuthorization: View Code /** * 所有需要配置权限的功能块都必须实现本接口 * * @author...

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

 

我有一个接口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;
    }
}

 

 

 

 

目录
相关文章
|
5月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
134 0
|
5月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
61 0
|
5月前
|
C++
C++实现单例模式-多种方式比较
单例模式,面试中经常被问到,但是很多人只会最简单的单例模型,可能连多线程都没考虑到,本文章从最简单的单例,到认为是最佳的单例模式实现方式,单例模式没有什么知识点,直接上源码
85 0
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
104 0
|
设计模式 安全 Java
特殊类设计及单例模式(C++)
特殊类设计及单例模式(C++)
75 1
|
4月前
|
设计模式 SQL 安全
Java设计模式:单例模式之六种实现方式详解(二)
Java设计模式:单例模式之六种实现方式详解(二)
单例模式设计(一)
饿汉模式 由名字我们就可以知道 &quot;饿汉&quot; 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实例,用static修饰,直接创建出来(提供一个现有的实例) 2. 在本类中写一个方法获取到上面的实例 3. 将这个类的构造方法设置为私有的,让外部不能 new 这个对象
59 0
|
安全 Java 编译器
单例模式的4种实现方式
单例模式的4种实现方式
100 0
|
5月前
|
设计模式 安全 Java
Java设计模式—单例模式的实现方式和使用场景
那么为什么要有单例模式呢?这是因为有的对象的创建和销毁开销比较大,比如数据库的连接对象。所以我们就可以使用单例模式来对这些对象进行复用,从而避免频繁创建对象而造成大量的资源开销。
146 1
|
安全
单例模式设计(二)
根据上面的 "懒汉模式" 和 "饿汉模式"。我们可以知道,懒汉模式,它只是负责读取,没有修改。而 " 饿汉模式 " 是既读取,也进行修改。所以来说, "懒汉模式" 是线程安全的, "饿汉模式" 是线程不安全的。
63 0