
出版社: 清华大学
原售价: 69.50
折扣价: 49.40
折扣购买: Java设计模式(高等学校设计模式课程系列教材)
ISBN: 9787302488316
刘伟,中南大学计算机应用技术博士,高级工程师,中国计算机学会会员,国家认证系统分析师,首批国家认证系统架构设计师,数据库系统工程师,微软认证系统工程师,CSDN认证专家及知名博主。具有十多年软件开发、项目管理及教育培训经验。
第3章简单工厂模式 本章导学 创建型模式关注对象的创建过程,是一类最常见的设计模式,在软件开发中的应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。 简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它是学习其他创建型模式的基础。在简单工厂模式中只需要记住一个简单的参数即可获得所需的对象实例,它提供专门的核心工厂类来负责对象的创建,实现对象创建和使用的分离。 本章将对6种创建型模式进行简要的介绍,并通过实例来学习简单工厂模式,理解简单工厂模式的结构及特点,学会如何在实际软件项目开发中合理地使用简单工厂模式。 本章知识点 创建型模式 简单工厂模式的定义 简单工厂模式的结构 简单工厂模式的实现 简单工厂模式的应用 简单工厂模式的优/缺点 简单工厂模式的适用环境 3.1创建型模式 软件系统在运行时类将实例化成对象,并由这些对象来协作完成各项业务功能。创建型模式(Creational Pattern)关注对象的创建过程,是一类最常用的设计模式,在软件开发中的应用非常广泛。创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节。 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。每一个创建型模式都通过采用不同的解决方案来回答3个问题,即创建什么(What)、由谁创建(Who)和何时创建(When)。 在GoF设计模式中包含5种创建型模式,通常将一种非GoF设计模式——简单工厂模式作为学习其他工厂模式的基础,这6种设计模式的名称、定义、学习难度和使用频率如表31所示。 表31创建型模式一览表 模 式 名 称 定义 学习难度 使用频率 简单工厂模式 (Simple Factory Pattern) 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 ★★☆☆☆ ★★★☆☆ 工厂方法模式 (Factory Method Pattern) 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类 ★★☆☆☆ ★★★★★ 抽象工厂模式 (Abstract Factory Pattern) 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类 ★★★★☆ ★★★★★ 建造者模式 (Builder Pattern) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 ★★★★☆ ★★☆☆☆ 原型模式 (Prototype Pattern) 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ★★★☆☆ ★★★☆☆ 单例模式 (Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例 ★☆☆☆☆ ★★★★☆ 3.2简单工厂模式概述 简单工厂模式并不属于GoF的23种经典设计模式,但通常将它作为学习其他工厂模式的基础,下面通过一个简单实例来引出简单工厂模式。 考虑一个水果农场,当用户需要某一种水果时该农场能够根据用户所提供的水果名称返回该水果。在此,水果农场被称为工厂(Factory),而生成的水果被称为产品(Product),水果的名称则被称为参数,工厂可以根据参数的不同返回不同的产品,这就是简单工厂模式的动机。该过程的示意图如图31所示,用户无须知道苹果(Apple)、橙(Orange)、香蕉(Banana)如何创建,只需要知道水果的名字即可得到对应的水果。 图31简单工厂模式示意图 作为最简单的设计模式之一,简单工厂模式的设计思想和实现过程都比较简单,其基本实现流程如下: 首先将需要创建的各种不同产品对象的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类; 然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象; 客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。 简单工厂模式的定义如下: 简单工厂模式(Simple Factory Pattern): 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 由于在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它是一种类创建型模式。简单工厂模式的要点在于当用户需要什么时,只需要传入一个正确的参数就可以获取所需要的对象,而无须知道其创建细节。 3.3简单工厂模式结构与实现 3.3.1简单工厂模式结构 简单工厂模式的结构比较简单,其核心是工厂类的设计,其结构如图32所示。 图32简单工厂模式结构图 由图32可知,简单工厂模式包含以下3个角色。 (1) Factory(工厂角色): 工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑; 工厂类可以被外界直接调用,创建所需的产品对象; 在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。 (2) Product(抽象产品角色): 它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。 (3) ConcreteProduct(具体产品角色): 它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。 3.3.2简单工厂模式实现 在简单工厂模式中客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象,它是工厂模式家族中最简单的一员。 在使用简单工厂模式时首先需要对产品类进行重构,不能设计一个包罗万象的产品类,而需根据实际情况设计一个产品层次结构,将所有产品类公共的代码移至抽象产品类,并在抽象产品类中声明一些抽象方法,以供不同的具体产品类来实现。典型的抽象产品类代码如下: public abstract class Product { //所有产品类的公共业务方法 public void methodSame() { //公共方法的实现 } //声明抽象业务方法 public abstract void methodDiff(); } 在具体产品类中实现了抽象产品类中声明的抽象业务方法,不同的具体产品类可以提供不同的实现。典型的具体产品类的代码如下: public class ConcreteProduct extends Product{ //实现业务方法 public void methodDiff() { //业务方法的实现 } } 简单工厂模式的核心是工厂类,在没有工厂类之前客户端一般会使用new关键字来直接创建产品对象,而在引入工厂类之后客户端可以通过工厂类来创建产品,在简单工厂模式中工厂类提供了一个静态工厂方法供客户端使用,根据所传入的参数不同可以创建不同的产品对象。典型的工厂类的代码如下: public class Factory { //静态工厂方法 public static Product getProduct(String arg) { Product product=null; if (arg.equalsIgnoreCase(\\\\\\\"A\\\\\\\")) { product=new ConcreteProductA(); //初始化设置product } else if (arg.equalsIgnoreCase(\\\\\\\"B\\\\\\\")) { product=new ConcreteProductB(); //初始化设置product } return product; } } 在客户端代码中,通过调用工厂类的工厂方法即可得到产品对象。其典型代码如下: public class Client { public static void main(String args[]) { Product product; product=Factory.getProduct(\\\\\\\"A\\\\\\\"); //通过工厂类创建产品对象 product.methodSame(); product.methodDiff(); } } 内容丰富,详细讲解7个面向对象设计原则和24个常用设计模式。 实例驱动,提供24个模式应用实例的完整设计方案和程序代码 学练结合,包含超过150道习题和3套设计模式模拟试题