设计模式笔记(二)创建型模式(Creational Pattern)

一、概述

1.所有的创建型模式都涉及到创建对象实例的方式,这很重要的原因是程序不应该依赖于对象如何创建和如何安排。

使用new运算符是C#创建一个对象实例最简单的方法:

Fred fred1 = new Fred();

但这实际上相当于硬编码,它和程序中如何创建对象有关。很多情况下创建对象的本意随程序的需求不同而不同,将创建过程抽象成一个专门的“创造器”类,会使程序更加灵活通用。

2.工厂方法模式(Factory Method Pattern):提供了一个简单的决策类,它根据提供的数据返回一个抽象基类的多个子类中的一个。

3.抽象工厂模式(Abstract Factory Pattern):提供了一个创建并返回一系列相关对象的接口。

4.单件模式(Singleton Pattern):指某个类只能有一个实例,它提供了一个访问该实例的全局访问点。

5.生成器模式(Builder Pattern):将一个复杂对象的构建与它的表示分开,以根据程序的需要创造不同的表示形式。

6.原型模式(Prototype Pattern):先实例化一个类,然后拷贝或克隆该类来创建新的实例,可以用共有方法进一步修改这些实例。

二、简单工厂模式

简单工厂模式(Simple Factory Pattern):根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,

1.trim()方法:删除字符串开始和末尾的空格。
2.简单工厂模式的基本原理:创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回;接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把和数据相关的问题与类的其他方法分隔开来。

3.简单工厂能返回具有相同方法的类的实例,它们可以是不同的派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。不管是哪一种形式,这些类实例中的方法必须是相同的,并且能够被交替使用。

三、工厂方法模式

工厂方法模式(Factory Method Pattern):对简单工厂模式进行扩展,它不是用一个专门的类来决定实例化哪一个子类,相反。超类把这种决定延迟到每个子类。这种模式实际上没有决策点,即没有直接选择一个子类实例化的决策。按这种模式编写的程序定义了一个抽象类,它去创建对象,但让子类决定创建哪一个对象。

1.何时使用工厂方法:

(1)一个类无法预测它要创建的对象属于哪一个类;

(2)一个类用它的子类来指定所创建的对象;

(3)把要创建哪一个类的信息局部化的时候。

2.对于实现工厂模式需要考虑的问题:

(1)基类是一个抽象类,模式必须返回一个完整的可工作的类;

(2)基类包含默认方法,除非默认方法不能胜任,才会调用这些方法;

(3)可以讲参数传递给工厂,告诉工厂返回哪一个类型的类,这种情况下,类可以共享相同的方法名,但完成的工作可以不同。

四、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)比工厂模式具有更高层次的抽象性。当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式。即抽象工厂是一个工厂对象,它能返回一系列相关类中的一个类,可以用简单工厂决定返回哪一个类。抽象工厂的一个强大功能是很容易添加新的子类,只要子类化基类即可。

1.抽象工厂的效果:

(1)抽象工厂的一个主要的目的是它能隔离要生成的具体类。这些类的实际类名隐藏在工厂里,在客户端不需要知道。

(2)由于类的隔离,可以自由改动或交换这些生成类系列。此外,由于只生成一类具体的类,系统会避免读者误用不同生成系列中的类。但添加新的类系列时注意要定义一些新的、无二义性的条件使工厂能够返回新的类系列。

2.抽象工厂需要注意的问题:尽管抽象工厂生成的所有类都具有相同的基类,但还是无法避免某些子类具有额外的、与其他类不同的方法。在其他子类中也存在同样的问题:不知道能否调用一个类方法,除非知道该子类是否允许使用那些方法。

  上述问题的解决方法:(1)在基类中定义所有的方法,即使这些方法没有实际的功能;(2)再派生出一个新的基类接口,它包含读者需要的所有方法和所有基类的子类。

四、单例模式

单例模式(Singleton Pattern)

1.试图解决的两个基本问题:全局访问和实例化控制。

2.饿汉式单例类:静态初始化的方式,在自己被加载时就将自己实例化。它是类一加载就实例化的对象,所以要提前占用系统资源。

3.懒汉式单例类:要在第一次被引用时才将自己实例化。会面临多线程访问的安全性问题,需要做双重锁定这样的处理才可以保证安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值