2 产品等级结构与产品族 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。 1 界面皮肤库的初始设计 Sunny软件公司欲开发一套界面皮肤
5 重载的工厂方法 Sunny公司开发人员通过进一步分析,发现可以通过多种方式来初始化日志记录器,例如可以为各种日志记录器提供默认实现;还可以为数据库日志记录器提供数据库连接字符串,为文件日志记录器提供文件路径;也可以将参数封装在一个Object类型的对象中,通过Object对象将配置参数传入工厂类。此时,可以提供一组重载的工厂方法,以不同的方式对产品对象进行创建。当然,对于同一个具
3 完整解决方案 Sunny公司开发人员决定使用工厂方法模式来设计日志记录器,其基本结构如图3所示: 图3 日志记录器结构图 在图3中,Logger接口充当抽象产品,其子类FileLogger和DatabaseLogger充当具体产品,LoggerFactory接口充当抽象工厂,其子类FileLoggerFactory和DatabaseLoggerFactory充当具
2 工厂方法模式概述 在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了“开闭原则”。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂
简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。 1 日志记录器的设计 Sunny软件公司欲开发一个系统运行日志记录器(Logger),该记录
3 完整解决方案 为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: 图2 图表库结构图 在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。完整代码如下
2 简单工厂模式概述 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下: 首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用
4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了“开闭原则”,有没有一种方法能够在不修改客户端代码的前提下更换具体产品对象呢?答案是肯定的,下面将介绍一种常用的实现方式。 我们可以将静态工厂方法的参数存储在XML或propertie
工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,
以下是一个示例XML文档,其中包含各种书籍的记录。 文件:books.xml 的文件内容如下 - 以下是一个示例Xquery文档,其中包含要在上述XML文档上执行的查询表达式。 目的是获取价格大于的那些XML节点元素。 文件:books.xqy 的内容如下 - 文件:XQueryTester.java 的内容如下 - 执行上面示例代码(XQueryTester.java),得到以下结果 - 要验证
主要内容:下载并运行ElasticSearch,使用REST API与Sense,文档管理(CRUD),由ID获取文档/索引,搜索,过滤,以下是纠正/补充内容:ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,所以您值得拥有。 在本教程中,将介绍开始使用ElasticSearch的一些主要概念。 下载并运行ElasticSearch ElasticSearch可以从elasticsearch.org下载对应的文件格式,如和。下载并提取一个运行它的软件包之后不会容易得
主要内容:GWT创建项目,GWT修改模块描述符,GWT修改CSS样式表,GWT修改主页文件,GWT修改人口点,GWT运行应用程序由于 GWT 的强大之处在于Write in Java, Run in JavaScript,我们将使用 Java IDE Eclipse 来演示我们的示例。 让我们从一个简单的HelloWorld应用程序开始 GWT创建项目 项目结构如下: 以下是所有重要文件夹的简要说明: 文件夹 描述 src 源代码(java 类)文件。 包含负责客户端 UI 显示的客户端特定 j
在本章中,我们将学习如何编写使用SLF4J的简单基本记录器程序。按照下面描述的步骤编写一个简单的记录器。 第1步 - 创建slf4j.Logger接口的对象 由于slf4j.Logger是SLF4J API的入口点,首先,需要获取/创建其对象。 类的方法接受表示名称的字符串值,并返回具有指定名称的对象。 第2步 - 记录所需的消息 接口的方法接受表示所需消息的字符串值,并将其记录在信息级别。 以下
在进入学习Google Gson库的细节之前,让我们先来看看一个使用Gson的应用程序的实际应用。 在这个例子中,创建了一个类。 将创建一个带有学生详细信息的JSON字符串,并将其反序列化为学生对象,然后将其序列化为JSON字符串。 示例 打开Eclipse,创建一个Java应用程序项目。然后创建一个Java文件:GsonFirstApp.java - 执行上面示例代码,得到以下结果 - 要记住的