工厂模式
模式分析
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
模式难点
模式解决问题
该模式主要解决接口选择的问题。我们明确地计划不同条件下创建不同实例时,让其子类实现工厂接口,返回的也是一个抽象的产品
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
模式应用场景
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
模式代码
abstract class Pen { draw(); } class Pencil implements Pen { draw() { print("this is Pencil"); } } class ColorPen implements Pen { draw() { print("this is ColorPen"); } } class RunFactory implements Run { @override main() { var pencil = getPen("Pencil"); var colorPen = getPen("ColorPen"); pencil.draw(); colorPen.draw(); } Pen getPen(String penStr) { if (penStr == "Pencil") { return new Pencil(); } else if (penStr == "ColorPen") { return new ColorPen(); } else { return null; } } } 复制代码
单例模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
模式分析
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
模式解决问题
- 控制实例数目,节省系统资源。
- 保证该类只有一个实例,多处共享
优点
- 内存中只有一个实例,减少了内存开销,尤其是频繁创建和销毁实例
- 避免对资源的多重占用
- 保证全局唯一实例从而保证实例状态一致
缺点
- 没有接口,不能继承
- 大量使用也会导致内存泄漏
模式应用场景
- 要求生产唯一序列号。
- WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
模式代码
class _SingleTon { _SingleTon._(); //第一种方式调用 factory _SingleTon() { return instance; } //第二种方式调用 static _SingleTon instance = _SingleTon._(); int count = 0; } class RunSingleTon implements Run { @override main() { print('单例模式创建'); print(_SingleTon().count++); print(_SingleTon.instance.count++); print(_SingleTon.instance.count++); } }