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)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
随机推荐
- firefox os 该设备呼叫移动开发
1)话筒 权限:telephony api:navigator.moztelephony 参考链接:https://wiki.mozilla.org/WebAPI/WebTelephony 2) 扬声 ...
- 常用在网站上的30个jQuery插件
jQuery插件是网页设计师最喜欢的.从图像滑块,图像画廊和导航插件,它们是如此众多,如此多样,如此惊人的和互动可以制作美化网站.在本文的在30个插件中,我认为必须在网站建设时用到.当然你现在可能不善 ...
- Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型
这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...
- windows下grunt安装提示不成功
在电脑按了node.js之后,在cmd中 输入 npm install -g grunt-cli 注意啦 不是 npm install -g grunt-cli 中间多了一个空格就安装不成功了,这个空 ...
- Effective C++(13) 用对象管理资源
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...
- MVC 5.1的遭遇:“已添加了具有相同键的项”
ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项” 最近将一个项目从ASP.NET MVC 3升级至刚刚发布的ASP.NET MVC 5.1,升级后发现一个ajax请 ...
- Markdown 代码测试
Mou Overview Mou, the missing Markdown editor for web developers. Syntax Strong and Emphasize strong ...
- SZU:G34 Love code
Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Normal Descrip ...
- 使用typeof方法反射属性和方法
Type type = typeof(System.Int32);//获得int类型的Type对象 foreach (MethodInfo method in type.GetMethods())// ...
- Load ContextCLR 探测
目录 背景Load ContextCLR 探测过程弱签名程序集的探测过程强签名程序集的探测过程Default ContextLoad-From ContextNo ContextRelfection- ...