徐麟家的博客

站在巨人的肩膀上

点评

装饰类就好像是一个一个包装的盒子,设计分为两部分ConcreteComponent(被包装的对象)和Decorator(包装类)同时继承自Component, Decorator::Operation()实现包装的操作,Decorator::SetComponent(Component) 负责如何包装。 装饰模式与创建者模式和模板方法模式相比,后两个模式注重过程的稳定性,时序的确定性;而前者更突出灵活性,可修改性。

点评

享元模式是一个即拿即用的,用于共享对象的设计模式。难点在于区分享元的内部对象(可以被公用的)和外部对象(用户独有的,用户数据等)。 对象池和享元的区别:对象池在创建一个新物体时会先在对象池中寻找需要的对象。如果存在,那么便直接将这个对象取出,并进行初始化。如果不存在,那么便新创建一个对象,在执行上述操作,注册到对象池中,对象池一般不自己创建对象,而是外部创建的。 享元模式则会在享元工厂中寻找需要的对象,将它的引用拿过来,没有就负责创建完它 ——————(即享元的工作会更多些,它会负责创建工作。)

点评

外观模式很好地体现了依赖倒转原则和迪米特法则的思想,所以非常常用。在层次式架构中尤为体现重要性,mvc相信大家有一定的了解,网上也有很多详细的文档,这里不在赘述。为了提供一些子系统的功能,快速操作model、view、control会有一个外观类(也叫门面)facade。为复杂的子系统提供一个简单的接口,能降低耦合度,便利用户使用。

点评

在实际开发中桥接是非常常见的设计,可能当你使用时你并没有发现:"原来你正在使用它"。建议当继承的类非常繁多的时候,可以仔细分析下对象之间的关系。就好像设计模式的名字桥接一样,这条引用的关系就是-桥,也体现了合成复用优先于继承的设计原则。

点评

在我看来适配器是一种很好的软件系统维护的补救措施。当我们开发了一套新系统,需要兼容老系统不是很快就能修改过来的功能,就可以先使用适配器来做个中间类隔离新系统和老系统的关联,而且很快就能投入使用。

点评

正如模式所描述的,用来构造复杂的对象,使构建和表示分类,提取出公共的创建流程,这样不容易出错,对用户隐藏了具体的创建过程。 对于创建过程的约束尤为重要,正式这点保证了代码不容易出错。还需要注意的一点是(可能在uml类图上不是很明确),用户最终是要得到一个产品,建造者完成后,最终会返回给用户一个产品(product),由用户来操作产品(product)对象。

点评

这一定是被大家用烂的设计模式,思想很简单-“构造方法私有化”,在类的生命周期中只有一个实例,对的怎么用都是他。
#从使用者的角度讲单例似乎和静态类类似,他们好像只是名词不一样,他们有什么区别?
想说下区别: 1)单例更讲究对象的属性,可以用来保存对象特有的属性;静态类更讲究方法 2)单例可以方便的继承和初始化;静态类就不是很好初始化,或者说不是那么直观的实现初始化工作。
#什么时候使用单例?什么时候使用静态类?
1)当你要维护一些生命周期,或者会保存状态属性,使用单例。编程中你往往看到很多xxxManager的代码,原因在此。 2)当你只是想提供一些通用的方法,他们不保存状态,使用静态类。编程中你往往会看到很多 xxxutil之类的工具类。

在c#等支持泛型的语言中我们可以编写一个泛型单例基类,能省去很多繁琐的单例创建工作。我们给出Unity中比较典型泛型单例,它真的很使用!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public abstract class MonoSingleton<T> : MonoBehaviour where T : Component
{
private static T m_instance = null;
public static T Instance
{
get
{
GameObject go = GameObject.Find("$MonoSingleton");
if (go == null)
{
go = new GameObject("$MonoSingleton");
}
if (!go.IsDestroyed())
{
DontDestroyOnLoad(go);
}

if (m_instance == null)
{
GameObject child = new GameObject(typeof(T).Name);
GameObject.DontDestroyOnLoad(child);
child.transform.SetParent(go.transform);
m_instance = child.AddComponent<T>();
}
return m_instance;
}
}

void Awake()
{
OnInit();
}


public virtual void OnInit()
{

}
}
#使用示例:
1
2
3
public class UIManager:MonoSingleton<UIManager>{...}
public class EffectManager:MonoSingleton<EffectManager>{...}
public class ResourcesManager:MonoSingleton<ResourcesManager>{...}
0%