? 重构后的代码:
public abstract class AbstractPay {
public abstract void pay(); }
public class CashPay extends AbstractPay {
public void pay() {
//现金支付处理代码 } }
public class PayMethodFactory {
public static AbstractPay getPayMethod(String type) {
if(type.equalsIgnoreCase(\ {
return new CashPay(); //根据参数创建具体产品 }
else if(type.equalsIgnoreCase(\ {
return new CreditcardPay(); //根据参数创建具体产品 } …… } }
? 简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,
加入必要的处理逻辑,这违背了“开闭原则”。
? 简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交
给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。 ? 简单工厂模式适用情况包括:工厂类负责创建的对象比较少;客户端只知道传入工
厂类的参数,对于如何创建对象不关心。
第5章_工厂方法模式
? 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器
(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 ? 抽象工厂类代码:
public abstract class PayMethodFactory {
public abstract AbstractPay getPayMethod(); }
? 具体工厂类代码:
public class CashPayFactory extends PayMethodFactory {
public AbstractPay getPayMethod() {
return new CashPay(); } }
? 客户类代码片段:
PayMethodFactory factory; AbstractPay payMethod; factory=new CashPayFactory();
payMethod =factory.getPayMethod(); payMethod.pay();
ProductFactory+factoryMethod (): Product...ConcreteProduct<
象的创建细节,系统具有良好的灵活性和可扩展性;其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。 符合开闭原则。
? 工厂方法模式适用情况包括:一个类不知道它所需要的对象的类;一个类通过其子
类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。
第6章_抽象工厂模式
? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依
赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
? 具体工厂类的典型代码如下:
public class ConcreteFactory1 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA1(); }
public AbstractProductB createProductB() {
return new ConcreteProductB1(); } }
? 抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创
建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
? 抽象工厂模式适用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合
和表达的细节;系统中有多于一个的产品族,而每次只使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
第9章_单例模式
? 单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自
行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
? 单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建
这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
? 单例模式的实现代码如下所示:
public class Singleton { private static Singleton instance=null; //静态私有成员变量
//私有构造函数 private Singleton() { }
//静态公有工厂方法,返回唯一实例 public static Singleton getInstance() { if(instance==null) instance=new Singleton(); return instance; } }
Singleton-instance: Singleton-Singleton ()+getInstance (): Singleton...if(instance==null) instance=new Singleton();return instance;instance ? 单例模式的主要优点在于提供了对唯一实例的受控访问并可以节约系统资源;其主
要缺点在于因为缺少抽象层而难以扩展,且单例类职责过重。
? 单例模式适用情况包括:系统只需要一个实例对象;客户调用类的单个实例只允许
使用一个公共访问点。
? 饿汉式单例与懒汉式单例类比较
? 饿汉式单例类在自己被加载时就将自己实例化。单从资源利用效率
角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
? 懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此
类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过同步化机制进行控制。
软件体系结构与设计模式笔记
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)