Java设计模式GOF之工厂模式
一、工厂模式(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之工厂模式的更多相关文章
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Java设计模式之二 ----- 工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- Java设计模式之二工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- Java设计模式系列之工厂模式
工厂模式将大量有共同接口的类实例化,工厂模式可以实现动态决定实例化哪一个类的对象,工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):添加某一种类型的 ...
- 【java设计模式】-02工厂模式
工厂模式简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客 ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
随机推荐
- zTree静态树与动态树的用法——(七)
0.[简介] zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实 ...
- 配置虚拟机时间使其与国内时间同步,linux时间 ntp
设置系统时间 [root@node2 ~]# date -s "10/30/18 09:30:00"Tue Oct 30 09:30:00 PDT 2018[root@node2 ...
- springboot中报异常Whitelabel Error Page
开始以为是url写错了,但其实不是,然后启动application类在的包是要在最顶部,并且和pom中groupid一样 这个也没错,后来发现能访问RestController中的url,但是进不了方 ...
- vm tools安装包为空
新装了linux mint虚拟机之后突然发现安装vm tools时为空 1.关闭虚拟机2.打开设置 3.把CD/DVD(SATA)从安装系统时挂载的镜像改为自动检测 4.重启安装vm tools发现没 ...
- Linux学习笔记-文件处理和权限命令
目录 文件处理命令 touch cat tac more less head tail 链接命令 ln 权限命令 chmod 权限管理命令 chown chgrp umask 文件处理命令 touch ...
- MySQL 导入CSV数据
第一步 创建表结构 create table t1( key1 ), v1 ) ); 第二步 导入数据 load data local infile 'D:/t1.csv' into table t1 ...
- WebApi Owin SelfHost OAuth2 - 授权服务和资源服务分离方案
使用JWT 参考:http://www.cnblogs.com/grissom007/p/6294746.html
- 浅谈js设计模式之策略模式
策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...
- WordPress“无法将上传的文件移动至wp-content/uploads/”的解决办法
WordPress“无法将上传的文件移动至wp-content/uploads/”的问题在有些配置不完善的虚拟主机或服务器中会碰到,一般会出现以下症状:1.无论是从文章编辑页面还是媒体库页面都无法上传 ...
- python_Appium测试环境搭建
Android环境搭建 移动端Appium环境部署比Web的selenium环境稍微复杂一些,如用python编写测试用例脚本或者开发测试框架以及UI自动化操作方法是一样的,基本是通用.因两者都是基于 ...