工厂模式主要分为三种简单工厂模式、工厂方法模式、抽象工厂模式三种。顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品。将该种思路放在我们面向对象开发实战中,就能使我们代码达到解耦。

  首先,在引出这三种关于工厂模式,我们介绍几组对象:

  1、抽象产品。所谓抽象产品,是具体抽象的抽象形式。例如:披萨、原料、汽车等(注:披萨和原料引自head first设计模式一书)。

  2、具体产品。抽象产品的具体化。蛤蜊披萨和素食披萨等就是抽象产品的具体化产品,面团、酱料和芝士等就是原料的具体化产品,但是会因为地域性差异,同一种产品是有所区别的。

  3、工厂。客户使用工厂对象方法获取到具体产品。

  • 简单工厂模式(Simple Factory Pattern)

  UML结构图如下所示:

   

  从UML结构图可以看出(注:简单工厂模式又称静态工厂模式):

  1. 工厂与抽象产品的关系是组合关系;
  2. 工厂类通过createProduct()方法创建产品,该方法内部根据形参;
  3. 作为Client,只需要通过实例化Factory调用creatProduct(){若该方法为非静态方法,若静态方法直接调用,不需要实例}获取相应的具体产品实例。

   简单工厂模式遵循着“封装变化”原则。客户后续需要更多种类的产品,只需要修改工厂类及新增具体产品类即可,从而产品的使用和产生的隔离。

  简单实例:

public abstract class Product {

}

public class ProductA extends Product{
public String toString() {
return "I am Product A";
}
} public class ProductB extends Product{
public String toString() {
return "I am Product B";
}
} public class SimpleFactory {
Product product;
public Product createProduct(int param){
switch (param) {
case 1:
product =new ProductA();
break;
case 2:
product =new ProductB();
break;
default:
break;
}
return product;
}
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Product proA = factory.createProduct(1);
System.out.println(proA);
Product proB = factory.createProduct(2);
System.out.println(proB);
}
/** 输出:
* I am Product A
* I am Product B
*
*/
}
  • 工厂方法模式(Factory Method Pattern

  简单工厂模式自身存在缺点,主要实现的目的是把变化部分出去出来,便于我们修改。但是这样对于新增产品,我们就得就修改工厂类,这样一来就已经不遵循“开-闭”原则{对修改关闭,对扩展开放}。

  因此,我们引入工厂方法模式

    定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

  UML结构图如下所示:

  

  利用工厂方法模式生产产品A或产品B,代码如下所示: 

//所有具体工厂的抽象工厂
public abstract class Factory {
public abstract Product createProduct();
}
//生产A的具体工厂
public class ProductFactoryA extends Factory {
public Product createProduct() {
return new ProductA();
}
} //生产B的具体工厂
public class ProductFactoryB extends Factory {
public Product createProduct() {
return new ProductB();
}
} public class Client {
public static void main(String[] args) {
Factory factory = new ProductFactoryA();
Product proA = factory.createProduct();
System.out.println(proA);
Factory factory2 = new ProductFactoryB();
Product proB = factory2.createProduct();
System.out.println(proB);
/**
* 输出:
* I am Product A
* I am Product B
*/
}
}
  • 抽象工厂模式(Abstract Factory Pattern

  抽象工厂模式提供一个接口,用于创建相关或依赖的家族,而不需要明确指定具体类。

  UML结构图如下图所示(参照于head first设计模式一书):

  抽象工厂方法其实就是工厂方法的一种升华:1、从客户的角度来看,只需要关注抽象工厂和抽象产品,不需要关注具体的产品和具体的工厂类实现。2、从抽象工厂的角度来看,不需要关注具体的工厂实现,也不需要关注生产产品,生产产品的都是派生类来实现。3、从具体工厂的角度来看,生产的产品有一定的共性,不需要关注具体产品的实现。。。这些都可以从类图里面看出来。通过类图,我们发现:工厂抽象和产品抽象是隔离的。

  觉得《Head First 设计模式》书中的例子才是经典的,就不给出源码,想看的只能找度娘了。

  • 总结

  1、所谓工厂,都是用来封装对象的创建;

  2、简单工厂实现将客户程序从具体类中解耦。但如果扩展产品,只能在工厂类里面修改,对于后期的维护以及扩展增加了困难;

  3、工厂方法使用了继承,把对象创建委托给子类,子类实现工厂方法来创建对象;

  。。。。

  这两个月工作有点忙,顺便学习了原始的servlet,设计模式看得比较少。共勉

  

设计模式----创建型模式之工厂模式(FactoryPattern)的更多相关文章

  1. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  2. PYTHON设计模式,创建型之简单工厂模式

    这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...

  3. 【C#设计模式——创建型模式】抽象工厂模式

    抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种 ...

  4. java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  5. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

  6. C#设计模式-创建型模式(转)

    一.简单工厂模式 简单工厂模式Simple Factory,又称静态工厂方法模式.它是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现. 优点: u 模式 ...

  7. OOAD之创建型模式之工厂模式

    首先我们为什么要学习设计模式呢? 1)模式从经验中总结出来的,经过证实的方案,模式只有在实际系统中经过多次验证之后才能成为模式. 2) 提高系统的可维护性, 通过使用设计模式,在系统面临升级和维护时, ...

  8. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  9. Unity C# 设计模式(二)简单工厂模式

    定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...

  10. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

随机推荐

  1. SpringBoot + JPA问题汇总

    实体类有继承父类,但父类没有单独标明注解 异常表现 Caused by: org.hibernate.AnnotationException: No identifier specified for ...

  2. VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示

    VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示: “事件”引起变量值的变化,系统引擎自动根据变量值的变化刷新页面 在VUE Nod ...

  3. vue-property-decorator vue typescript写法

    什么是Typescript TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法.作者是安德斯大爷, Delphi ...

  4. 随笔之AJAX粗解 小白入门向

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 最大的 ...

  5. CentOS7.2搭建LAMP环境

    所谓的Lamp就是:Linux+Apache+mysql+php.这里的Linux使用CentOS7.2. 0x00 开始我们可以先更新一下yum: # 升级所有包同时也升级软件和系统内核 yum - ...

  6. response对响应的设置

    1.response对象设置响应行状态码: protected void doGet(HttpServletRequest request, HttpServletResponse response) ...

  7. PHPCon 2019 第七届 PHP 开发者大会总结

    往届回顾-2018:PHPCon 2018链接: https://pan.baidu.com/s/17nfrfqk9K4vwKPAsjBVW7A——提取码:rjbr 随着PHP7的诞生,兼顾了高性能和 ...

  8. TestNG(十五)xml文件实现多线程测试

    package com.course.testng.thread; import org.testng.annotations.Test; public class ThreadOnXml { @Te ...

  9. [VB.NET Tips]赋值运算千万要注意

    赋值运算符是一个语句,不能在表达式中使用,表达式中的等号表示相等而不是赋值. 上示例: Dim x As Integer Dim y As Object x = 5 y = x = 5 Console ...

  10. [Linux] Telnet提示:Unable to connect to remote host: No route to host

    出错现象: [root@localhost ~]# telnet 192.168.1.128 Trying 192.168.1.128...telnet: connect to address 192 ...