新足迹

 找回密码
 注册

精华好帖回顾

· 关西的鳞爪 - 2014年4月大阪有马京都旅记 - 【全文完】 顶楼有电梯 - 258楼推荐かね井荞麦面 288 锦市场 (2014-4-21) 胡须康 · 一个钢琴陪练爸的五年心得 (2018-3-5) lingjoy
· 远在8000多公里外的第二故乡- 墨尔本,Frankston (2010-9-13) Lisa · 一组Coffs Harbour的照片 (2009-10-29) 老陶
Advertisement
Advertisement
12
返回列表 发新帖
楼主:澳贼

各位.net 高手,前辈,大师 [复制链接]

发表于 2010-10-11 10:37 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Design Pattern随着requirement变化,一句话很难说清楚。
举个C#的例子。

我要有一个class叫UserManager,里面有2个Method,AddUser(string username),DeleteUser(string username),这个class不需要有任何variable或者property。

一般会这样写
public class UserManager 或者public static class UserManager
{
public static void AddUser(string username)
{
//xxxx
}

public static void DeleteUser(string username)
{
//xxxxx
}
}

简洁明了。

然后有一天你老板说我们要来一个AdminUserManager要继承UserManager,AddUser要override,
问题来了,static 的不能override。

那你只能用Singleton

public class UserManager  
{

public static readonly UserManager  Instance = new UserManager  ();

private UserManager()
{
}

public virtual void AddUser(string username)
{
//xxxx
}

public virtual void DeleteUser(string username)
{
//xxxxx
}
}



public class AdminUserManager  : UserManager
{

public static new AdminUserManager  Instance = new AdminUserManager ();

private AdminUserManager()
{
}

public overridevoid AddUser(string username)
{
//xxxx
}



过了几个月,你发现UserManager的constructor里面要占用很多资源,而且有可能你的程序根本不需要用UserManager,你会把
public static readonly UserManager  Instance = new UserManager  ();

private UserManager()
{
}

改写成:

protected static UserManager  instance;

public static UserManager Instance
{
get
{
if(instance == null)
{
instance = new UserManager();
}
return instance;
}
}

这样的话,只有你用了UserManager.Instance的时候才会initialise这个object。
这个就变成了Lazy Initialisation。



所以说要根据你的requirement,来决定用什么。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-10-11 10:49 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我現在全部用IOC, singleton 用的比較有限。
头像被屏蔽

禁止发言

发表于 2010-10-11 10:57 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jerryclark 于 2010-10-11 11:37 发表
Design Pattern随着requirement变化,一句话很难说清楚。
举个C#的例子。

我要有一个class叫UserManager,里面有2个Method,AddUser(string username),DeleteUser(string username),这个class不需要有任何variable或者prope ...


如果不用,AdminUserManager为何要继承UserManager??
签名被屏蔽
头像被屏蔽

禁止发言

发表于 2010-10-11 10:58 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-10-11 11:49 发表
我現在全部用IOC, singleton 用的比較有限。


Inversion of control?? 高手们聊聊天,我就能学到很多东西。哈哈哈
签名被屏蔽

发表于 2010-10-11 11:03 |显示全部楼层
此文章由 realfenglin 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 realfenglin 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-10-11 11:49 发表
我現在全部用IOC, singleton 用的比較有限。


个人工作中的感觉:
singleton
在对于一些重复性高,需要统一生成,管理,操作的系统来说效率是不错的。
那自己的系统的一部分做个测试。SINGLETON的内存占用还算不错。不知道他是不是最合理的节省内存的模式。
但是,就是有的时候,自己不注意,一些垃圾,不能及时收回,带来一些额外的苦恼
同时,在多线程的时候,出现过几次麻烦。

发表于 2010-10-11 11:05 |显示全部楼层
此文章由 realfenglin 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 realfenglin 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-11 11:57 发表


如果不用,AdminUserManager为何要继承UserManager??


个人里理解:
不用UserManager.并不意味,不需要AdminUserManager。
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-11 11:11 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 realfenglin 于 2010-10-11 12:03 发表


个人工作中的感觉:
singleton
在对于一些重复性高,需要统一生成,管理,操作的系统来说效率是不错的。
那自己的系统的一部分做个测试。SINGLETON的内存占用还算不错。不知道他是不是最合理的节省内存的模式。
但是,就是有 ...


请继续讨论。我是受益匪浅
签名被屏蔽

发表于 2010-10-11 11:12 |显示全部楼层
此文章由 pengruijun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 pengruijun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
缩小范围, 在.net 里, 其实就是 abstract, interface, inherit. 为基础。 一个pattern 变动点 就变成另外一个Pattern。 没必要死扣那些pattern.
自己根据需要 变动点 也可以叫 pattern 的

发表于 2010-10-11 11:14 |显示全部楼层

回复 31# 的帖子

此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我没有你这个例子的full context,可能这只是你工作中一小段code,并不全。

off the top of my head, 但如果这些manager没有任何state需要maintain,不要用singleton,直接用static method就好了,作成manager helper class. 从manager这个名字上来看,可能应该有自己的state.

2010年度奖章获得者

发表于 2010-10-11 11:24 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
傳統意義上來講,manager 用singleton是很標準的。

但這個class 要sealed。


但,static method絕對不對。

2010年度奖章获得者

发表于 2010-10-11 11:37 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
還有上面那個singleton 的例子,不是thread-safe 的。
Advertisement
Advertisement

发表于 2010-10-11 11:44 |显示全部楼层
此文章由 realfenglin 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 realfenglin 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-10-11 12:37 发表
還有上面那個singleton 的例子,不是thread-safe 的。


这个的确要注意。
头像被屏蔽

禁止发言

发表于 2010-10-11 11:49 |显示全部楼层

看来,大老虎是高手中的高高手

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整

2010年度奖章获得者

发表于 2010-10-11 11:56 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
來個最嚴格的Manager class, thread-safe 的。

public sealed class UserManager
    {
        private static volatile UserManager _instance;
        private static object _syncRoot = new object();

        public static UserManager Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_syncRoot)
                    {
                        if (_instance == null)
                            _instance = new UserManager();
                    }
                }

                return _instance;
            }
        }

        private UserManager() { }

        public void Add() { }
    }
不過微軟說的,這種double-checking locking 的方法,大多數情況下是過於安全了。通常 a static initialization 就足夠了。

评分

参与人数 1积分 +3 收起 理由
澳贼 + 3 补昨天的

查看全部评分

足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2010-10-11 12:44 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 pengruijun 于 2010-10-11 11:12 发表
缩小范围, 在.net 里, 其实就是 abstract, interface, inherit. 为基础。 一个pattern 变动点 就变成另外一个Pattern。 没必要死扣那些pattern.
自己根据需要 变动点 也可以叫 pattern 的 ...


吃饭回来了~~~~

31#的代码是随手乱写的,我只是想说明的是这个意思。Pattern这个东西,说的太多就像马克思主义一样了。再多问就想用砖头砸了。
头像被屏蔽

禁止发言

发表于 2010-10-11 12:45 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jerryclark 于 2010-10-11 13:44 发表


吃饭回来了~~~~

31#的代码是随手乱写的,我只是想说明的是这个意思。Pattern这个东西,说的太多就像马克思主义一样了。再多问就想用砖头砸了。


看来像成为高手,首先要成为暴力男
签名被屏蔽
Advertisement
Advertisement

发表于 2010-10-11 12:59 |显示全部楼层
此文章由 fenghuo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fenghuo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Singleton可以看看这个:
http://blog.csdn.net/masefee/archive/2010/09/23/5902266.aspx
虽然是C++的,但是道理是一样的。

评分

参与人数 1积分 +3 收起 理由
澳贼 + 3 补昨天的

查看全部评分

头像被屏蔽

禁止发言

发表于 2010-10-11 13:06 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 fenghuo 于 2010-10-11 13:59 发表
Singleton可以看看这个:
http://blog.csdn.net/masefee/archive/2010/09/23/5902266.aspx
虽然是C++的,但是道理是一样的。


非常谢谢
签名被屏蔽

发表于 2010-10-11 13:47 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
enough said about singleton,it's rarely used, don't put too much in it.

pretty sure u have a lot more better things need your attention.

发表于 2010-10-11 14:18 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个各位都是高人, 我四年前的领导, 她给了我一本四人帮的书, 到现在看了三页.

从来都是用建模工具做反向工程, 不带任何修改的拿来就用. 有人说正确的方法应该是先使用design patterns设计好对象然后正向生成数据库, 我一直不理解这一点, 总是先从数据库入手做起, 好像数据库设计好了其余都简单了.

发表于 2010-10-11 14:43 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2010-10-11 15:18 发表
这个各位都是高人, 我四年前的领导, 她给了我一本四人帮的书, 到现在看了三页.

从来都是用建模工具做反向工程, 不带任何修改的拿来就用. 有人说正确的方法应该是先使用design patterns设计好对象然后正向生成数据库 ...


gof的那本书褒贬不一,我几年前看过,当时我对design pattern都有相当多的应用了,还看得很晕,远没有网上很多variation那么简洁。

正统的database driven的app design应该是从database design开始bottom up的,曾经流行过一阵object oriented database,我看过类似的书,它的schema设计理念跟传统关系型数据库相悖,有很多practise我不敢冒而且没有得到community的支持,就没再继续看下去。
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-11 14:45 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-10-11 14:47 发表
enough said about singleton,it's rarely used, don't put too much in it.

pretty sure u have a lot more better things need your attention.


so, wat r the 'better things'??
签名被屏蔽

发表于 2010-10-11 15:08 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-11 15:45 发表


so, wat r the 'better things'??


more frequent used patterns, have fun !!!
头像被屏蔽

禁止发言

发表于 2010-10-11 17:12 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-10-11 16:08 发表


more frequent used patterns, have fun !!!


wat r they?? please
签名被屏蔽

发表于 2010-10-12 08:25 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-11 18:12 发表


wat r they?? please


去先前提供的这个website
http://www.dofactory.com/Patterns/Patterns.aspx

每一种pattern都有Frequency of use,不知道这个freqency怎么来的,大多数make sense.

评分

参与人数 1积分 +4 收起 理由
澳贼 + 4 知道了,谢谢

查看全部评分

头像被屏蔽

禁止发言

发表于 2010-10-12 09:29 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-10-12 09:25 发表


去先前提供的这个website
http://www.dofactory.com/Patterns/Patterns.aspx

每一种pattern都有Frequency of use,不知道这个freqency怎么来的,大多数make sense.


知道了,谢谢!
签名被屏蔽
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部