本文出自 http://blog.csdn.net/shuangde800
注意,在设计模式中,所谓的“实现一个接口”,不一定就表示”写一个类,并利用implements关键词来实现某个java接口“,而是泛指“实现某个超类型(可以是类或接口)的某个方法”
认识工厂模式
在简单工厂模式的SimpleFactory, 你确实可以创建比萨,但是其他部分:烘烤,切片等可能不同的店会有不同的差异。
如果我们要在其他地方开比萨店,比如在北京开比萨店,那么北京的制作比萨是不一样风格的,使用这个类的话,可能就要修改代码。所以把制作比萨的代码绑在PizzaStore里,这样做没有弹性。
那么要怎样做呢?
我们可以把createPizza()放回PizzaStore中,不过要把它设置成“抽象方法”,然后为每个不同地方的比萨店创建一个PizzaStore的子类:
public abstract class PizzaStore { // 在PizzaStore里,"工厂方法"现在是抽象的 abstract Pizza createPizza(String item); public Pizza orderPizza(String type) { Pizza pizza; // 现在createPizza()方法从工厂对象中移回PizzaSotre pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }
、
有了一个PizzaStore的抽象类,让不同地方的比萨店都继承这个PizzaStore,每个子类各自决定如何制造比萨。
注意!这个做法是让PizzaStore的各个子类负责定义自己的createPizza()方法,这实际上是把决定推迟到了子类
记住,把决定推迟到了子类,这是工厂模式的重要特征!
现在我们来实现一个子类,创建一个芝加哥的比萨店:
public class ChicagoPizzaStore extends PizzaStore { Pizza createPizza(String item) { if (item.equals("cheese")) { return new ChicagoStyleCheesePizza(); } else if (item.equals("veggie")) { return new ChicagoStyleVeggiePizza(); } else if (item.equals("clam")) { return new ChicagoStyleClamPizza(); } else if (item.equals("pepperoni")) { return new ChicagoStylePepperoniPizza(); } else return null; } }
子类只要实现createPizza就可以了,这样子类可以自己决定要创建什么对象,而不用管其他东西,就很灵活了。
工厂模式定义
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。 工厂方法让类把实例化推迟到子类。
工厂方法模式能够封装具体类型的实例化,看下面类图,抽象的Creator提供了一个创建对象的方法的接口,也称为“工厂方法”。在抽象的Creator中,任何其他实现的方法,都可能用到这个工厂所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。
设计原则:依赖倒置
要依赖抽象,不要依赖具体类
看下面这个不使用工厂模式的比萨店,看它依赖了多少个具体类。
public class DependentPizzaStore { public Pizza createPizza(String style, String type) { Pizza pizza = null; if (style.equals("NY")) { if (type.equals("cheese")) { pizza = new NYStyleCheesePizza(); } else if (type.equals("veggie")) { pizza = new NYStyleVeggiePizza(); } else if (type.equals("clam")) { pizza = new NYStyleClamPizza(); } else if (type.equals("pepperoni")) { pizza = new NYStylePepperoniPizza(); } } else if (style.equals("Chicago")) { if (type.equals("cheese")) { pizza = new ChicagoStyleCheesePizza(); } else if (type.equals("veggie")) { pizza = new ChicagoStyleVeggiePizza(); } else if (type.equals("clam")) { pizza = new ChicagoStyleClamPizza(); } else if (type.equals("pepperoni")) { pizza = new ChicagoStylePepperoniPizza(); } } else { System.out.println("Error: invalid type of pizza"); return null; } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }
当直接实例化一个对象时,就是在依赖它的具体类。
我们已经知道了“要针对接口编程,而不要针对具体编程”原则, 和依赖倒置原则原则很像,但是这里更强调“抽象”。
这个原则说明了:不能让高层组件以来低层组件,而且不管高层或低层组件,“两者”都应该依赖于抽象
所谓“高层”组件,是由其他低层组件定义其行为的类。例如,PizzaStore 是高层组件,因为它的行为是由比萨定义的:PizzaStore创建所有不同的比萨对象,而比萨本身属于低层组件。
在这个“比萨图”中,PizzaStore是“高层组件”,而比萨实现是“低层组件”, PizzStore依赖于这些具体比萨类。
我们应用“依赖倒置”原则来改变上面的类:
使用工厂方法后,高层组件(PizzaStore)和低层组件(那些具体比萨)都依赖了Pizza的抽象。
先要遵循依赖倒置原则,工厂方法并非是唯一的技巧,却是最有为例的技巧之一。
下面的知道方针可以帮助避免在OO设计中违反依赖倒置原则:
1. 变量不可以持有具体类的引用。
如果使用new,就会持有具体类的引用,可以改用工厂来避开这样的做法。
2. 不要让类派生自具体类
如果派生自具体类,就会依赖这些具体类。请派生自一个抽象接口或抽象类。
3. 不要覆盖基类中已实现的方法。
如果覆盖基类已实现的方法,那么你的基类就不是一个真正适用被继承的对象。基类中已实现的方法,应该由所有的子类共享。
相关推荐
以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示...
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...
这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...
### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
- **抽象工厂模式**(Abstract Factory):提供一个接口,用于创建相关或依赖对象的族,而无需指定它们具体的类。 - **建造者模式**(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...
本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...
主要分为五种:工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton)、建造者\Builder、原型\(Prototype\)。例如,工厂方法允许在子类中定义实例化对象的具体过程,而单例模式确保一个类只有一个...
本笔记主要讲述了设计模式的基本概念和应用,包括 Iterator 模式、Adapter 模式、TemplateMethod 模式、FactoryMethod 模式和 Singleton 模式等。通过对这些设计模式的详细解释和示例代码的分析,我们可以更好地理解...
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示...
根据提供的文件信息,我们可以将设计模式分为两大类:创建型模式和结构型模式,并在此基础上进一步探讨每种设计模式的特点及应用场景。 ### 创建型模式 #### Singleton(单例)模式 - **定义**:确保一个类仅有一...
文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
:check_mark:工厂方法模式( Factory Method Pattern ) :memo: , :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_mark:建造者模式( Builder Pattern ) :memo: , :check_mark:单例...
5. **学习设计模式的意义** - 提高代码的可读性和可维护性,使得其他人更容易理解和修改代码。 - 提升软件设计质量,避免重复造轮子,提高开发效率。 - 有助于软件架构师进行系统设计,使系统更加灵活、可扩展。 ...