Factory Pattern(工厂模式)
1、工厂模式简介
工厂模式,专门负责将大量有共同接口的类实例化(用来生产对象)。其定义为定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。
工厂模式拥有以下几种类型:
- 简单工厂模式:又称为静态工厂模式
- 工厂方法模式
- 抽象工厂模式
2、简单工厂模式
通过工厂类的静态方法来获取需要的对象。以下代码使用简单工厂模式来实现图形工厂,用来获取不同类型的图形。

Shape抽象类定义:
public abstract class Shape {
public abstract void info();
}
Shape子类定义:
public class Rectangle extends Shape {
@Override
public void info() {
System.out.println("rectangle");
}
}
public class Circle extends Shape {
@Override
public void info() {
System.out.println("circle");
}
}
ShapeFactory定义
public class ShapeFactory {
public static <T extends Shape> T getShape(Class<T> c) {
Shape shape = null;
try {
shape = (Shape) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return (T) shape;
}
}
Cilent定义
public class Client {
public static void main(String[] args) {
Shape shape = ShapeFactory.getShape(Rectangle.class);
shape.info();
}
}
Java中,DateFormat就是使用简单工厂模式的例子,它通过getDateInstance()方法来获取实例对象。
3、工厂方法模式
工厂方法模式是简单工厂模式的衍生。在简单工厂模式中,工厂类集中了所有产品的创建逻辑,这会导致扩展的不利。同时简单工厂模式只在有限的程度上支持开闭原则,而工厂模式支持开闭原则。在以上代码中进行了优化,在简单工厂实现部分使用了反射来实例化对象,免去了自己编写代码实例化对象。但是如果产品类构造方法比较复杂,则需要自己使用构造方法来实例化,显然不支持开闭原则,每次添加新的产品时需修改工厂类。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
以下代码将简单工程模式的程序改为使用工厂方法模式:

Shape、Rectangle、Circle同简单工厂,
ShapeFactory:
public abstract class ShapeFactory {
public abstract Shape create();
}
RectangleFactory:
public class RectangleFactory extends ShapeFactory {
@Override
public Shape create() {
return new Rectangle();
}
}
CircleFactory:
public class CircleFactory extends ShapeFactory {
@Override
public Shape create() {
return new Circle();
}
}
Cilent:
public class Client {
public static void main(String[] args) {
ShapeFactory factory = new CircleFactory();
factory.create().info();
}
}
在Java中,工厂模式被广泛应用,例如Collection的iterator()。
4、抽象工厂模式

产品等级结构:AbstractProductA和AbstractProductB,即产品系列
产品族:指位于不同产品等级结构中,功能相关联的产品组成的家族。换个角度,就是一个抽象工厂所能生产出来的产品集合。
以下使用案例使用抽象工厂模式

此例子中,UnixButton和UnixLabel为一个产品族,WinButton和WinLabel为一个产品族。Button和Label为产品等级结构。
public abstract class Button {}
public class UnixButton extends Button {}
public class WinButton extends Button {}
Label同上代码,省略...
public abstract class AbstractFactory {
public abstract Button createButton();
public abstract Label createLabel();
}
public class UnixFactory extends AbstractFactory {
@Override
public Button createButton() {
return new UnixButton();
}
@Override
public Label createLabel() {
return new UnixLabel();
}
}
public class WinFactory extends AbstractFactory {
@Override
public Button createButton() {
return new WinButton();
}
@Override
public Label createLabel() {
return new WinLabel();
}
}
增加新的产品族时,就意味着每一个产品等级结构中增加一个或多个新的具体或抽象产品角色。例如加入Android系列的,则只需要未Button和Label添加Andorid子类,再创建一个AndroidFactory。并不需要更改工厂角色和产品角色。符合“开闭原则”。
增加新的产品等级结构时,例如增加Text,在工厂类中需要添加createText()方法,其子类都要进行实现。显然违背了“开闭原则”。
Spring的IoC容器就是一个典型的抽象工厂模式。
5、总结
简单工厂:只有一个产品等级结构,能生产任意产品。添加新产品时需要改动代码。不符合“开闭原则”;
工厂方法:只有一个产品等级结构,一个工厂只能生产特定产品。添加新产品时只需继承抽象实现新工厂。符合“开闭原则”;
抽象工厂:多个产品等级结构,能生产不同产品族的任意产品。添加产品族时符合“开闭原则”。
Factory Pattern(工厂模式)的更多相关文章
- 设计模式(四) Factory Pattern工厂模式
核心: 实例化对象,实现创建者和调用者的分离 简单工厂模式 工厂方法模式 抽象工厂模式 面对对象设计的基本原则: ocp(open closed principle) 开闭原则:一个软件的实体应当对拓 ...
- 工厂模式(factory pattern) ------创造型模式
创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...
- 抽象工厂模式(abstract factory pattern)------创造型模式
创建型模式:抽象工厂模式 引入概念: 1.产品等级结构:当抽象的产品由具体的工厂生产出不同的产品时,这些归属与同一类的抽象产品就构成了产品等级结构: 2.产品族:具体的工厂可以生产出来的不同产品就构成 ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- 设计模式(四)The Factory Pattern 出厂模式
一.简单工厂 定义:定义一个创建对象的接口,可是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架.详细的实现由其子类来完毕. 与简单工厂相比, ...
- c++ 设计模式9 (Abstract Factory 抽象工厂模式)
5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...
- Simple Factory 简单工厂模式(静态工厂)
基本概念: 1) Simple Factory模式属于创建型模式, 2) 简单工厂模式是由一个工厂(注意是一个!)对象决定创建出哪一种产品类的实例(例如你到肯德基说你要鸡腿,要薯条,要饮料还是,,,这 ...
- Simple Factory (简单工厂模式)
简单工厂模式不是23种设计模式之一,简单工厂模式属于创建型模式, 又叫做静态工厂方法(Static Factory Method) 简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模 ...
- Java设计模式:Simple Factory(简单工厂)模式
概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
随机推荐
- Scala Web 框架——Lift(一)准备工作
[Lift]Scala Web 框架——Lift(一)准备工作 Lift 官方网站:http://liftweb.net/ 下载 http://liftweb.net/download 下载.zip压 ...
- Jqury笔记
1. --------------- -var aa = new Array(); aa.push(1); alert(aa[0]); var aa=[];也表示一个数组: ------------ ...
- grunt实用总结
grunt实用总结 文章梗概如下: 如何让Grunt在项目跑起来 初识:Gruntfile.js 术语扫盲:task & target 如何运行任务 任务配置 自定义任务 文件通配符:glob ...
- C# BackgroundWorker组件学习
C# BackgroundWorker组件学习 C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...
- 区别CSS中display:box;inline;none以及HTML中 <frame> 标签<table> 标签的 frame 属性
区别display:box:display:inline:display:none三者的不同 display:block的特点是: block是Display默认的值.总是在新行上开始:该对象随后的内 ...
- Aliexpress API 授权流程整理
Aliexpress API 授权流程整理 前言 我零零总总用了好几个月的时间,写了一个自用的小程序,从 Aliexpress 上抓取订单的小程序.刚开始写的时候,该API还没有开放,而且没有订单 ...
- java分割excel文件可用jxl
excel导入是经常使用到的功能,如果文件数据量大的话还是建议分割后导入,java常用的API是poi和jxl,我采用的是jxl,那么让我们来看下怎么用jxl来实现分割. 需要在pom中导入jxl的包 ...
- T-SQL编程的基本语法和思想
通过一个很实用的例子让你学会T-SQL编程的基本语法和思想 例子需求:把Execl中的三级分类(列别的三级联动)数据导入到数据库中. Excel表中数据的显示格式: 图1 数据库中表的显示格式: ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
- 那天有个小孩教我WCF[一][1/3]
那天有个小孩教我WCF[一][1/3] 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不 ...