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(工厂模式)的更多相关文章

  1. 设计模式(四) Factory Pattern工厂模式

    核心: 实例化对象,实现创建者和调用者的分离 简单工厂模式 工厂方法模式 抽象工厂模式 面对对象设计的基本原则: ocp(open closed principle) 开闭原则:一个软件的实体应当对拓 ...

  2. 工厂模式(factory pattern) ------创造型模式

    创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...

  3. 抽象工厂模式(abstract factory pattern)------创造型模式

    创建型模式:抽象工厂模式 引入概念: 1.产品等级结构:当抽象的产品由具体的工厂生产出不同的产品时,这些归属与同一类的抽象产品就构成了产品等级结构: 2.产品族:具体的工厂可以生产出来的不同产品就构成 ...

  4. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  5. 设计模式(四)The Factory Pattern 出厂模式

    一.简单工厂 定义:定义一个创建对象的接口,可是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架.详细的实现由其子类来完毕. 与简单工厂相比, ...

  6. c++ 设计模式9 (Abstract Factory 抽象工厂模式)

    5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...

  7. Simple Factory 简单工厂模式(静态工厂)

    基本概念: 1) Simple Factory模式属于创建型模式, 2) 简单工厂模式是由一个工厂(注意是一个!)对象决定创建出哪一种产品类的实例(例如你到肯德基说你要鸡腿,要薯条,要饮料还是,,,这 ...

  8. Simple Factory (简单工厂模式)

    简单工厂模式不是23种设计模式之一,简单工厂模式属于创建型模式, 又叫做静态工厂方法(Static Factory Method) 简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模 ...

  9. Java设计模式:Simple Factory(简单工厂)模式

    概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...

随机推荐

  1. 零基础学习iOS开发

    零基础学习iOS开发不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍了函数的定义和使 ...

  2. javascript模拟title提示效果

    本代码可以实现如下情况: 1.js实现title是为了解决自定义样式和格式! 2.希望传入的格式可以不限制是否包含html结构! 3.可以自定义显示层的位置! js如下: function GetAb ...

  3. Lucene.net入门学习

    Lucene.net入门学习(结合盘古分词)   Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全 ...

  4. postal邮件发送(一):基本配置

    前言 源码:https://github.com/andrewdavey/postal 文档:http://aboutcode.net/postal/ postal最大好处就是再也不用拼接html发送 ...

  5. SQL Server 2008 允许远程链接,适用于广域网和局域网

    用户在使用SQL Server 2008远程链接时,可能会弹出如下对话框: 在链接SQL服务器时发生网络链接错误或特定实例错误.SQL服务器不存在或者链接不成功.请验证用户名是否正确或SQL服务器是否 ...

  6. win7 64位下如何安装配置mysql-5.7.7-rc-winx64

    距离上次安装MySQL已经过去好久了.步骤这些,有可能会忘记.简单记录一下吧.(参考了一些网络上的博客.) 1.mysql-5.7.5-m15-winx64.zip下载 官方网站下载地址: http: ...

  7. Asp.Net Web Api 接口,拥抱支持跨域访问。

    如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...

  8. mass种子模块之domready

    总结:由于IE6/7/8不支持DOMContentLoaded事件,虽然它支持onreadystatechange事件,但是readyState=complete几乎和onload事件一样,需要等页面 ...

  9. 领域模型中分散的事务如何集中统一处理(C#解决方案)

    领域模型中分散的事务如何集中统一处理(C#解决方案)   开篇 什么是事务,事务的应用场景 做项目时,经常会遇到一些需求,比如注册用户时,要求同时存入用户的基本信息和初始化该用户的帐户,如果在这两个环 ...

  10. iOS证书深究

    iOS证书深究 iOS的系列证书很令人头痛,但是也提供了完整的保护. 在开发过程中,遇到的基本的证书有Xcode真机调试或者打包用证书,也有消息推送证书等:每种证书分为开发版(development) ...