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)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
随机推荐
- Android在View拉丝工艺和invalidate()和其他相关方法
转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 . ...
- 在希望的田野上--生物柴油(Biodiesel)光明的未来
请看下图: 这是科学家Bernie Tao教授给美国Purdue大学的学生们出的题目"有关大豆.谷物产品的创新竞赛",实质上,就是鼓舞研究.开发及应用生物柴油(Biodiesel) ...
- 数据分析R语言1
数据分析R语言 无意中发现网上的一个数据分析R应用教程,看了几集感觉还不错,本文做一个学习笔记(知识点来源:视频内容+R实战+自己的理解),视频详细的信息请参考http://www.itao521.c ...
- windows 8以上找回开始菜单
步骤如下: 右击任务栏,选择工具栏——新建工具 在工具栏---新建工具栏的输入框中输入,”C:\ProgramData\Microsoft\Windows\Start Menu\Programs,然后 ...
- 领域模型中分散的事务如何集中统一处理(C#解决方案)
领域模型中分散的事务如何集中统一处理(C#解决方案) 开篇 什么是事务,事务的应用场景 做项目时,经常会遇到一些需求,比如注册用户时,要求同时存入用户的基本信息和初始化该用户的帐户,如果在这两个环 ...
- [转]loadView的用法,loadView创建基本界面,DidLoad读入数据
loadview: // 有没有nib 只要是复写了loadview loadview都会被执行 有nib文件的话加载的是nib文件的view 没有的话会按照loadview里的代码加载 ...
- go语言defer使用
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...
- ASP.NET MVC相关
Orchard源码分析(7):ASP.NET MVC相关 概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供 ...
- jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别 现在做的一个项目,所使用的框架是基于jQuery扩展的,于是平时学了一下jQuery,了解到了它的扩展函数: ...
- Dynamic CRM 2013 on Windows Azure VM
三个A2 Size的VM,运行Windows Server 2012: AD Server,SQL Server,App Server 将AD Server的ip地址填写到Windows Azure虚 ...