一、工厂模式(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. xgboost与sklearn的接口

    xgb使用sklearn接口(推荐) XGBClassifier from xgboost.sklearn import XGBClassifier clf = XGBClassifier( sile ...

  2. 差分约束系统专题 && 对差分约束系统的理解

    具体能解决的问题: 求最长路,最短路,或者判断解是否存在. 在建边的时候: 一般是给你区间减法的关系,或者是这个点到另一个点的关系.如果给你的关系是除法的话,我们可以通过使用两边同时取log的方式,将 ...

  3. 2016.5.19——vector型的输入输出

    vector型的输入输出 在上节2015.5.18——leetcode:Majority Element中纠结vector的动态输入输出问题,但是发现vector传参型的不可以动态输入输出,但是vec ...

  4. 2016.5.14——leetcode-HappyNumber,House Robber

    leetcode:HappyNumber,House Robber 1.Happy Number 这个题中收获2点: 1.拿到题以后考虑特殊情况,代码中考虑1和4,或者说<6的情况,动手算下.( ...

  5. Interval Minimum Number

    Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. ...

  6. XSS注入常用语句

    <script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javas ...

  7. 吾修叫板微软,QMVC说比MVC5快!

    前段时间发一篇文章,是关于QMVC介绍的文章,有网友建议写篇关于测试结果的文章.毕竟QMVC是开源的,并且是倾向于性能级开发的,因为我实在不喜欢MVC5还采用跟web form一样的开发风格,不停的封 ...

  8. 列表选择Spinner

    1.只用XML配置来显示列表 在res\values中添加一个arrays.xml 1 <?xml version="1.0" encoding="utf-8&qu ...

  9. 03 Editor plugins and IDEs 编辑器插件和 ide

    Editor plugins and IDEs  编辑器插件和 ide Introduction  介绍 Options 选项   Introduction 介绍 This document list ...

  10. java基础27 单例集合Collection及其常用方法

    1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据    2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...