一、工厂模式(Factory)

1、实现了创建者和调用者的分离

2、应用场景
  ①JDK中 Calendar 的 getInstance();
  ②JDBC 的 Connection 对象的获取;
  ③Hibernate 的 SessionFactory 创建 Session 对象;
  ④Spring 的 IOC 容器创建管理 Bean 对象;
  ⑤XML 的解析时 DocumentBuilderFactory 创建解析器对象;
  ⑥反射中 Class 对象的 newInstance()。

3、分类:
  ①简单工厂模式(也叫静态工厂模式,经常使用)
    1、用来生产同一等级结构中的任意产品;
    2、对于新增的产品,需要修改已有的代码。
    3、不满足开闭原则(对扩展开放,对修改关闭)

  ②工厂方法模式
    1、用来生产同一等级结构中的固定产品;
    2、支持增加任意产品。

    3、支持开闭原则(对扩展开放,对修改关闭)。

  ③抽象工厂模式
    1、用来生产不同产品族的全部产品;
    2、增加新的产品(一个),无能为力;
    3、支持增加产品族。

二、工厂模式的代码实现

1、简单工厂模式

1.1、简单工厂模式产品的接口: Car.java

 package cn.com.zfc.gof01.factory.simplefactoy;

 /**
*
* @title Car
* @describe 简单工厂模式产品的接口 Car
* @author 张富昌
* @date 2017年4月4日下午8:44:42
*/
public interface Car {
  public abstract void run(); }

1.2、简单工厂模式产品接口 Car 的实现类: Audi.java

 package cn.com.zfc.gof01.factory.simplefactoy;

 /**
*
* @title Audi
* @describe 简单工厂模式产品接口 Car 的实现类: Audi.java
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Audi implements Car {   @Override
  public void run() {
    System.out.println("奥迪在行驶");
  } }

1.3、 简单工厂模式产品接口 Car 的实现类 :Benz.java

 package cn.com.zfc.gof01.factory.simplefactoy;

 /**
*
* @title Benz
* @describe 简单工厂模式产品接口 Car 的实现类: Benz.java
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Benz implements Car {   @Override
  public void run() {
    System.out.println("奔驰在行驶");
  } }

1.4、简单工厂模式产品接口 Car 的实现类:Bmw.java

 package cn.com.zfc.gof01.factory.simplefactoy;

 /**
*
* @title Bmw
* @describe 简单工厂模式产品接口 Car 的实现类 Bmw
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Bmw implements Car {   @Override
  public void run() {
    System.out.println("宝马在行驶");
  } }

1.5、简单工厂模式的工厂类:CarFactory.java

 package cn.com.zfc.gof01.factory.simplefactoy;

 /**
*
* @title CarFactory
* @describe 简单工厂,一般使用静态的方法
* @author 张富昌
* @date 2017年4月4日下午8:50:08
*/
public class CarFactory {   // 获取 Bmw 的实例
  public static Car getBmw() {
    return new Bmw();
  }   // 获取 Benz 的实例
  public static Car getBenz() {
    return new Benz();
  }   // 获取 Audi 的实例
  public static Car getAudi() {
    return new Audi();
  } }

1.6、测试没有工厂类的前提下,创建 Audi、Benz、Bmw:TestNoFactory.java

 package cn.com.zfc.gof01.factory.simplefactoy.test;

 import cn.com.zfc.gof01.factory.simplefactoy.Audi;
import cn.com.zfc.gof01.factory.simplefactoy.Benz;
import cn.com.zfc.gof01.factory.simplefactoy.Bmw;
import cn.com.zfc.gof01.factory.simplefactoy.Car; /**
*
* @title TestNoFactory
* @describe 没有工厂类,创建 Audi、Benz、Bmw
* @author 张富昌
* @date 2017年4月4日下午8:52:37
*/
public class TestNoFactory {
  public static void main(String[] args) {
    // 需要知道接口和其实现类
    Car c1 = new Audi();
    Car c2 = new Benz();
    Car c3 = new Bmw();
    c1.run();
    c2.run();
    c3.run();
  } }

1.7、测试在有工厂类的前提下,创建 Audi、Benz、Bmw:TestSimpleFactory.java

 package cn.com.zfc.gof01.factory.simplefactoy.test;

 import cn.com.zfc.gof01.factory.simplefactoy.Car;
import cn.com.zfc.gof01.factory.simplefactoy.CarFactory; /**
*
* @title TestSimpleFactory
* @describe 测试简单工厂模式,有工厂类,创建 Audi、Benz、Bmw
* @author 张富昌
* @date 2017年4月4日下午8:56:39
*/
public class TestSimpleFactory {
   public static void main(String[] args) {
    // 需要知道接口和工厂类
    Car c1 = CarFactory.getAudi();
    Car c2 = CarFactory.getBenz();
    Car c3 = CarFactory.getBmw();
    c1.run();
    c2.run();
    c3.run();
  }
}

2、工厂方法模式

2.1、简单工厂模式产品的接口: Car.java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title Car
* @describe 简单工厂模式产品的接口 Car
* @author 张富昌
* @date 2017年4月4日下午8:44:42
*/
public interface Car {
  public abstract void run();
}

2.2、工厂方法模式产品接口 Car 的实现类 :Audi.java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title Audi
* @describe 工厂方法模式产品接口 Car 的实现类 Audi
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Audi implements Car {   @Override
  public void run() {
    System.out.println("奥迪在行驶");
  } }

2.3、工厂方法模式产品接口 Car 的实现类 Benz

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title Benz
* @describe 工厂方法模式产品接口 Car 的实现类 :Benz.java
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Benz implements Car {   @Override
  public void run() {
    System.out.println("奔驰在行驶");
  } }

2.4、工厂方法模式产品接口 Car 的实现类:Bmw.java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title Bmw
* @describe 工厂方法模式产品接口 Car 的实现类 Bmw
* @author 张富昌
* @date 2017年4月4日下午8:45:48
*/
public class Bmw implements Car {   @Override
  public void run() {
    System.out.println("宝马在行驶");
  } }

2.5、工厂方法模式的工厂接口:CarFactory.java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title CarFactory
* @describe 工厂方法模式的工厂接口 CarFactory
* @author 张富昌
* @date 2017年4月4日下午9:05:18
*/
public interface CarFactory {
  Car getCar();
}

2.6、 工厂方法模式的工厂类,需要实现工厂接口:AudiFactory .java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title AudiFactory
* @describe 工厂方法模式的工厂类,需要实现工厂接口
* @author 张富昌
* @date 2017年4月4日下午9:07:08
*/
public class AudiFactory implements CarFactory {   @Override
  public Car getCar() {
    return new Audi();
  } }

2.7、工厂方法模式的工厂类,需要实现工厂接口:BenzFactory .java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title BenzFactory
* @describe 工厂方法模式的工厂类,需要实现工厂接口
* @author 张富昌
* @date 2017年4月4日下午9:07:08
*/
public class BenzFactory implements CarFactory {   @Override
  public Car getCar() {
    return new Benz();
  } }

2.8、工厂方法模式的工厂类,需要实现工厂接口:CarFactory .java

 package cn.com.zfc.gof01.factory.factorymethod;

 /**
*
* @title BmwFactory
* @describe 工厂方法模式的工厂类,需要实现工厂接口
* @author 张富昌
* @date 2017年4月4日下午9:07:08
*/
public class BmwFactory implements CarFactory {   @Override
  public Car getCar() {
    return new Bmw();
  } }

2.9、测试工厂方法模式:TestFactoryMethod.java

 package cn.com.zfc.gof01.factory.factorymethod.test;

 import cn.com.zfc.gof01.factory.factorymethod.AudiFactory;
import cn.com.zfc.gof01.factory.factorymethod.BenzFactory;
import cn.com.zfc.gof01.factory.factorymethod.BmwFactory;
import cn.com.zfc.gof01.factory.factorymethod.Car; /**
*
* @title TestFactoryMethod
* @describe 测试工厂方法模式
* @author 张富昌
* @date 2017年4月4日下午9:09:34
*/
public class TestFactoryMethod {
  public static void main(String[] args) {
    // 需要知道接口和各自的工厂类
    Car c1 = new AudiFactory().getCar();
    Car c2 = new BenzFactory().getCar();
    Car c3 = new BmwFactory().getCar();
    c1.run();
    c2.run();
    c3.run();
  }
}

3、抽象工厂模式

3.1、抽象工厂的产品接口,发动机:Engine.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title Engine
* @describe 抽象工厂的产品接口,发动机
* @author 张富昌
* @date 2017年4月4日下午9:27:21
*/
public interface Engine {
  // 发动机效率
  void efficiency();
}

3.2、抽象接口的产品接口,座位:Seat.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title Seat
* @describe 抽象接口的产品接口,座位
* @author 张富昌
* @date 2017年4月4日下午9:38:21
*/
public interface Seat {
  // 座位舒适
  void comfort(); }

3.3、抽象工厂的产品接口,轮胎:Tyre.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title Tyre
* @describe 抽象工厂的产品接口,轮胎
* @author 张富昌
* @date 2017年4月4日下午9:39:06
*/
public interface Tyre {
  // 轮胎磨损
  void wear();
}

3.4、抽象工厂模式的产品实现类,低端发动机:LowEngine.java

 package cn.com.zfc.gof01.factory.abstractfactory;
/**
*
* @title LowEngine
* @describe 抽象工厂模式的产品实现类,低端发动机
* @author 张富昌
* @date 2017年4月4日下午9:55:02
*/
public class LowEngine implements Engine {   @Override
  public void efficiency() {
    System.out.println("低端发动机工作效率低");
  } }

3.5、抽象工厂模式的产品实现类,高端发动机:LuxuryEngine.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title LuxuryEngine
* @describe 抽象工厂模式的产品实现类,高端发动机
* @author 张富昌
* @date 2017年4月4日下午9:48:05
*/
public class LuxuryEngine implements Engine {   @Override
  public void efficiency() {
    System.out.println("高端发动机工作效率高");
  } }

3.6、抽象工厂模式的产品实现类,低端座位:LowSeat.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title LowSeat
* @describe 抽象工厂模式的产品实现类,低端座位
* @author 张富昌
* @date 2017年4月4日下午9:55:32
*/
public class LowSeat implements Seat {   @Override
  public void comfort() {
    System.out.println("低端座位舒适度低");
  } }

3.7、抽象工厂模式的产品实现类,高端座位:LuxurySeat.java

 package cn.com.zfc.gof01.factory.abstractfactory;
/**
*
* @title LuxurySeat
* @describe 抽象工厂模式的产品实现类,高端座位
* @author 张富昌
* @date 2017年4月4日下午9:55:49
*/
public class LuxurySeat implements Seat {   @Override
  public void comfort() {
    System.out.println("高端座位舒适度高");
  } }

3.8、抽象工厂模式的产品实现类,低端轮胎:LowTyre.java

 package cn.com.zfc.gof01.factory.abstractfactory;
/**
*
* @title LowTyre
* @describe 抽象工厂模式的产品实现类,低端轮胎
* @author 张富昌
* @date 2017年4月4日下午9:55:40
*/
public class LowTyre implements Tyre {   @Override
  public void wear() {
    System.out.println("低端轮胎易磨损");
  } }

3.9、抽象工厂模式的产品实现类,高端轮胎:LuxuryTyre.java

 package cn.com.zfc.gof01.factory.abstractfactory;
/**
*
* @title LuxuryTyre
* @describe 抽象工厂模式的产品实现类,高端轮胎
* @author 张富昌
* @date 2017年4月4日下午9:55:55
*/
public class LuxuryTyre implements Tyre {   @Override
  public void wear() {
    System.out.println("高端轮胎不易磨损");
  } }

3.10、抽象工厂的产品族工厂接口:CarFactory.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title CarFactory
* @describe 抽象工厂的产品族工厂接口
* @author 张富昌
* @date 2017年4月4日下午9:54:28
*/
public interface CarFactory {
  Engine getEngine();   Seat getSeat();   Tyre getTyre();
}

3.11、抽象工厂的产品族工厂接口的实现类,低端工厂:LowCarFactory.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title LowCarFactory
* @describe 抽象工厂的产品族工厂接口的实现类,低端工厂
* @author 张富昌
* @date 2017年4月4日下午10:07:40
*/
public class LowCarFactory implements CarFactory {   @Override
  public Engine getEngine() {
    return new LowEngine();
  }   @Override
  public Seat getSeat() {
    return new LowSeat();
  }   @Override
  public Tyre getTyre() {
    return new LowTyre();
  } }

3.12、抽象工厂的产品族工厂接口的实现类,高端工厂:LuxuryCarFactory.java

 package cn.com.zfc.gof01.factory.abstractfactory;

 /**
*
* @title LuxuryCarFactory
* @describe 抽象工厂的产品族工厂接口的实现类,高端工厂
* @author 张富昌
* @date 2017年4月4日下午9:59:38
*/
public class LuxuryCarFactory implements CarFactory {   @Override
  public Engine getEngine() {
    return new LuxuryEngine();
  }   @Override
  public Seat getSeat() {
    return new LuxurySeat();
  }   @Override
  public Tyre getTyre() {
    return new LuxuryTyre();
  } }

3.13、测试抽象工厂模式:TestAbstractFactory.java

 package cn.com.zfc.gof01.factory.abstractfactory.test;

 import cn.com.zfc.gof01.factory.abstractfactory.CarFactory;
import cn.com.zfc.gof01.factory.abstractfactory.Engine;
import cn.com.zfc.gof01.factory.abstractfactory.LuxuryCarFactory; /**
*
* @title TestAbstractFactory
* @describe 测试抽象工厂模式
* @author 张富昌
* @date 2017年4月4日下午10:18:39
*/
public class TestAbstractFactory {
  public static void main(String[] args) {
    CarFactory carFactory = new LuxuryCarFactory();
    Engine engine = carFactory.getEngine();
    engine.efficiency();
  }
}

Java设计模式GOF之工厂模式的更多相关文章

  1. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  2. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  3. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  4. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  5. Java设计模式之二 ----- 工厂模式

    在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...

  6. Java设计模式之二工厂模式

    在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...

  7. Java设计模式系列之工厂模式

    工厂模式将大量有共同接口的类实例化,工厂模式可以实现动态决定实例化哪一个类的对象,工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):添加某一种类型的 ...

  8. 【java设计模式】-02工厂模式

    工厂模式简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客 ...

  9. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

随机推荐

  1. MySQL 5.7半同步复制after sync和after commit详解【转】

    如果你的生产库开启了半同步复制,那么对数据的一致性会要求较高,但在MySQL5.5/5.6里,会存在数据不一致的风险.有这么一个场景,客户端提交了一个事务,master把binlog发送给slave, ...

  2. shell监控网站是否自动运行并自动重启【原创】

    shell监控网站是否自动运行并自动重启 #!/bin/bash -T www.baidu.com ];then echo "`date` 网站访问正常!" >> /r ...

  3. Django 内置模板标签和过滤器

    一.内置模板标签 语法:{%  %} autoescape : 是否转义,on或off作为参数,并确定自动转义是否在块内有效.该块以endautoescape结束 {% autoescape on % ...

  4. Python基础(2):__doc__、文档字符串docString、help()

    OS:Windows 10家庭中文版,Python:3.6.4 Python中的 文档字符串(docString) 出现在 模块.函数.类 的第一行,用于对这些程序进行说明.它在执行的时候被忽略,但会 ...

  5. C# TimeSpan获取 年月

    public static string GetYearMonthDayString(this DateTime expires) { try { var now = DateTime.Now; Ti ...

  6. 如何在线预览github上的html页面?

    可以通过http://htmlpreview.github.io/这个网站,直接在线预览html页面. ↓    ↓ 可以发现:这个网站直接将github上的页面地址当做参数来传递.

  7. js数据绑定(模板引擎原理)

    <div> <ul id="list"> <li>11111111111</li> <li>22222222222< ...

  8. java基础26 线程的通讯;wait()、notify()、notifyAll()等方法

    线程的通讯:一个线程完成了自己的任务时,要通知另一个线程去完成另一个任务 1.1.方法 wait():等待.如果线程执行到了wait()方法,那么该线程会进入等待状态,等待状态下的线程必须要被其他线程 ...

  9. 最后一面《HR面》------十大经典提问

    1.HR:你希望通过这份工作获得什么? 1).自杀式回答:我希望自己为之工作的企业能够重视质量,而且会给做得好的员工予以奖励.我希望通过这份工作锻炼自己,提升自己的能力,能让公司更加重视我. a.“我 ...

  10. U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法

    U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法 出现原因:在写入或读取文件时,进行复制操作,此时复制到的文件是不完整的!或者移动硬盘/U盘中途被拔出,导致文件损坏 异常现象:被删文件(夹)属 ...