大家把自己关于设计模式的问题和心得什么的拿出来共享吧?(yysun老师,cheka,左轻侯,房客,wjiachun,吴剑明,cAkk,千中元,雁孤行,吕雪松,g

  • 主题发起人 主题发起人 VRGL
  • 开始时间 开始时间
unit Singleton;
{$B-}
interface
uses
Classes;
type
TSingleton = class(TObject)
protected
class function Lookup(const aClassName: ShortString): Integer;
virtual;
class procedure Register(const aClassName: ShortString;
aInstance: TObject);
virtual;
procedure UnRegister(const aClassName: ShortString);
virtual;
procedure Init;
virtual;
//私有成员初始化
proceduredo
ne;
virtual;
//释放私有成员动态申请的资源
public
class function NewInstance: TObject;
override;
procedure FreeInstance;
override;
end;

implementation
uses
SysUtils;
type
PRegistryItem = ^TRegistryItem;
TRegistryItem = record
ClassName: ShortString;
Instance : TObject;
RefCount : Integer;
end;

var
_Registry : TList;
class function TSingleton.Lookup(const aClassName: ShortString): Integer;
var
Index : Integer;
Item : PRegistryItem;
begin
Result := -1;
Index := 0;
while (Result = -1) and (Index < _Registry.Count)do
begin
Item := _Registry[Index];
if (Item <> nil) and (UpperCase(aClassName) = Item^.ClassName) then
Result := Index;
Inc(Index);
end;
end;

class procedure TSingleton.Register(const aClassName: ShortString;
aInstance: TObject);
var
Item : PRegistryItem;
begin
if Lookup(aClassName) < 0 then
begin
New(Item);
Item^.ClassName := UpperCase(aClassName);
Item^.Instance := aInstance;
Item^.RefCount := 1;
_Registry.Add(Item);
end;
end;

procedure TSingleton.UnRegister(const aClassName: ShortString);
var
Index: Integer;
Item : PRegistryItem;
begin
Index := Lookup(aClassName);
if Index >= 0 then
begin
Item := _Registry[Index];
if Item^.RefCount = 0 then
begin
_Registry.Delete(Index);
Dispose(Item);
end;
end;
end;

class function TSingleton.NewInstance: TObject;
var
Index : Integer;
Item : PRegistryItem;
Instance : TObject;
begin
Index:= Lookup(ClassName);
if Index < 0 then
begin
Instance := inherited NewInstance;
TSingleton(Instance).Init;
Register(ClassName, Instance);
end
else
begin
Item := _Registry[Index];
Instance := Item^.Instance;
Inc(Item^.RefCount);
end;

Result := Instance;
end;

procedure TSingleton.FreeInstance;
var
Index : Integer;
Item : PRegistryItem;
FreeIt : Boolean;
begin
FreeIt := True;

Index:= Lookup(ClassName);
if Index >= 0 then
begin
Item := _Registry[Index];
Dec(Item^.RefCount);
if Item^.RefCount > 0 then
FreeIt := False;
end;

if FreeIt then
begin
UnRegister(ClassName);
do
ne;
inherited FreeInstance;
end;
end;

procedure TSingleton.Init;
begin
end;

procedure TSingleton.Done;
begin
end;

//-------
procedure Free_Registry;
var
Index : Integer;
Item : PRegistryItem;
begin
if Assigned(_Registry) then
begin
for Index := 0 to _Registry.Count - 1do
begin
Item := _Registry[Index];
if Item <> nil then
Dispose(Item);
end;

_Registry.Free;
_Registry := nil;
end;
end;

initialization
_Registry := TList.Create;
finalization
Free_Registry;

end.
 
剩下的几个, 等项目结束后在贴上来. 其实设计模式和数据结构一样, 都是开发人员
在项目实践中把具体应用抽象出来的, 作为指导更多项目的理论. 但是如果单纯的为
设计模式而设计就不足取了, 一切都要具体问题具体分析, 根据项目的要求, 开发人
员的实力, 成本等因素综合考虑. 很多应用程序的总体结构设计其实也可以参考各种
操作系统的设计思想, 具体实现时才考虑到设计模式, 数据结构等方面的内容.
 
我喜欢看武侠小说,觉得使用设计模式的最高境界就像小说里那样,
理解掌握那些设计模式,再把它们都忘了[:D]
 
容我这里可以大概给你介绍一下,但对于每一种编程模型要看具体的示例是什么,而且我不可能给你罗列所有的代码,请谅解。
其实我们编程只要尽量站到比较高的层次,很多道理其实你会发现你已经懂了。
就多线程来说,我们开始设想只有两个线程(>2时是不是算数学归纳法?)那么如果两个独立的线程会发生什么呢?
1。当一个线程进入moniter(也就是说站用一个object),另一个线程只有等待或返回,而我们把返回就称为一种模式,这种模式的英文是Balking。
2。这两个线程可以是有序的执行,而不是让OS来调度,这时我们要用一个object来调度,这种模式称为Scheduler。(这个词及其含义其实OS中就有)。
3。如果这两个线程同时读一个资源,我们可以让他们执行,但如果同时写的话,你闭着眼睛都会知道可能出现问题,这时我们就要用另一种模式(Read/Write Lock)。
4。如果一个线程是为另一个线程服务的话,比如IE中负责数据传输的线程和界面显示的线程,当一个图片没有传完时,另一个线程就无法显示,至少是部分没有传完。那么这时我们要用一个模式称为生产者和消费者,英文是Producer-Consumer。
5。两个线程的消亡也可以不是完全又OS来控制的,这时我们需要给出一个条件,使得每个线程在符合条件是才消亡,也就是有序的消亡,我们称为Two-Phase Termination。
那么有这5个线程模型,基本上可以用到大多数编程任务中。我需要指出的三点是:
1。从高层次上我们可以再验证是否含盖了所有的情况。
2。其实模式不是完全固定的或者说象定律一样,而模式可以为不同的情况进行适当 的调整和组合,目的是为了简洁和高效。
3。学习模式是为了具备更好的分析问题的能力。
而似乎这些来自西方的技术,并且是目前的,我们有没有呢?其实我个人有个大胆的推测,我认为我们祖先的《孙子兵法》就是很好设计模式,因为它符合设计模式需要的基本特征,就是在特定的条件下,用某种特定的方式合理且高效的解决问题。只不过一是用在军事上,二是完备性方面我们还没研究。但我认为我们至少没有很好的扩展和进行类比式的应用,否则今天可能是我们中国人教外国人什么是设计模式。
类比的方法实际上是发明或发现的常用方法。不知能否让你感觉到其实外国的技术并不是那么的神秘,也许我们从自身的文化当中挖掘出的东西太少了。
P.S.更深一步的研究你可以参考Doug Lea. <<Concurrent Programming in Java>>.
 
听听课 ^_^
 
to AIHUA,
残念啊,我只有书,没有电子的。
 
好好学习
 
让偶搬个板凳
 
欣赏中~~~~~~~~~~~
 
通过简单看过各位大虾的讨论,我自己感觉对于UML的理解是不是这样:
目的就是为了提高代码的重复使用率,而实际模式实际上就是将解决问题的方法系统
话。举一个简单的例子,比如我现在要解决了问题,那么为了以后能在解决类似的方法时
也使用这些代码,那么我就应该想一个比较通用的方法,然后留下代码,那么以后我遇到
同样的问题的时候也可以使用这些代码,而且还应该具备的特点就是,以后我有了更好的
解决方法后,只需要修改这段代码而不需要修改整个程序的代码就可以实现解决方法的升
级。
如果是这样,那么我觉得我们很多的朋友都在这样做,或者都试图这样做,不过做的
不好,或者说没有系统起来知道怎样做。(比如编写一个通用的DLL,我感觉它的思路就属
于此范畴)
不知道我说的对不对,请各位大虾指正。
另外我建议仅提出听课的朋友,最好不要发言,只需要点[将此问题提前]和[订阅邮件
通知]或者[收藏此问题]就可以了,要不然很影响阅读。
 
我听!我听!我听听听!
 
不要就这样没有下文了,欢迎继续
 
我来捡玉。
 
UML只是一种建模语言,同设计模式本不是一会事的。
或有一些共同点,但还是不能混淆。
常见有人研究设计模式,也常同人谈论过此问题。
不论是数据建模,还是设计模式,
最终都是为了我们能很好的理解问题和设计问题,
前面几人的讲叙都很好,使在下受益非浅。
望这类问题能在大富翁上讨论。
正所谓“万般神通皆小术,唯有空空是大道”
这“空空大道”就是指的设计模式。
有空研究一下《设计模式》一书会大有进谓。
只是Delphi对接口的支持有所缺陷,此为之憾……
 
后退
顶部