GOF23设计模式之工厂模式(factory)
一、工厂模式概述
实现了创建者和调用者的分离
(1)分类
①简单工厂模式
虽然某种程度不符合设计原则,但实际使用最多。
②工厂方法模式
不修改已有类的前提下,通过增加新的工厂类实现扩展。
③抽象工厂模式
不可以增加产品,可以增加产品族。
二、不使用工厂模式时
1.创建一个汽车的接口
public interface Car {
void run();
}
2.创建两个实现汽车接口的类:
public class Audi implements Car {
public void run() {
System.out.println("奥迪在跑...");
}
}
public class Byd implements Car {
public void run() {
System.out.println("比亚迪在跑...");
}
}
3.客户端创建实例:
public class Client {
public static void main(String[] args) {
Car c1 = new Audi();
Car c2 = new Byd();
c1.run();
c2.run();
}
}
控制台输出:
奥迪在跑...
比亚迪在跑...
当客户没有需求改动时,完全可以不使用工厂模式。但是当需要创建更多实例或者需要频繁更改时,只需要引入工厂或者更改工厂类中的代码就可以了,这样就实现了解耦,是工厂模式的一大好处。
三、简单工厂(simplefactory)
简单工厂模式也叫静态工厂模式,就是工厂类一般使用静态方法,通过接收的参数的不同来返回不同的对象实例。
缺点:对于增加新产品无能为力!不修改代码的话,是无法扩展的。
1.创建接口和实现类
public interface Car {
void run();
}
public class Audi implements Car {
public void run() {
System.out.println("奥迪在跑...");
}
}
public class Byd implements Car {
public void run() {
System.out.println("比亚迪在跑...");
}
}
2.创建简单工厂类
public class CarFactory {
public static Car creatCar(String type) {
if (type.equals("奥迪")) {
return new Audi();
} else if (type.equals("比亚迪")){
return new Byd();
}
return null;
}
}
3.测试
public class Client {
public static void main(String[] args) {
Car c1 = CarFactory.creatCar("奥迪");
Car c2 = CarFactory.creatCar("比亚迪");
c1.run();
c2.run();
}
}
控制台输出:
奥迪在跑...
比亚迪在跑...
4.或者创建另一种简单(静态)工厂类
public class CarFactory {
public static Car creatAudi() {
return new Audi();
}
public static Car creatByd() {
return new Byd();
}
}
5.测试
public class Client {
public static void main(String[] args) {
Car c1 = CarFactory.creatAudi();
Car c2 = CarFactory.creatByd();
c1.run();
c2.run();
}
}
控制台输出:
奥迪在跑...
比亚迪在跑...
通过工厂类创建实例,实现解耦。
四、工厂方法(factorymethod)
一个类对应一个工厂实现类,避免了开闭原则的弊端,更容易扩展代码。但是从复杂度来分析,简单工厂模式更优,因为对客户而言,简单工厂更简单。
1.创建汽车接口和汽车工厂接口
public interface Car {
void run();
}
public interface CarFactory {
Car createCar();
}
2.创建汽车的接口和汽车工厂方法的实现类
public class Audi implements Car {
public void run() {
System.out.println("奥迪在跑...");
}
}
public class AudiFactory implements CarFactory {
public Car createCar() {
return new Audi();
}
}
public class Byd implements Car {
public void run() {
System.out.println("比亚迪在跑...");
}
}
public class BydFactory implements CarFactory {
public Car createCar() {
return new Byd();
}
}
3.测试
public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar();
c1.run();
c2.run();
}
}
控制台输出:
奥迪在跑...
比亚迪在跑...
不再与实际类打交道,而通过工厂来创建对象,实现解耦。增加新的产品也更加方便。
4.增加新的产品
public class Benz implements Car {
public void run() {
System.out.println("奔驰在跑...");
}
}
public class BenzFactory implements CarFactory {
public Car createCar() {
return new Benz();
}
}
5.测试
public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar();
Car c3 = new BenzFactory().createCar();
c1.run();
c2.run();
c3.run();
}
}
控制台输出:
奥迪在跑...
比亚迪在跑...
奔驰在跑...
五、抽象工厂
抽象工厂模式用来生产不同产品族的全部产品。(对于新增加某一个完整的产品,无能为力;仅支持增加产品族;)
产品族: 发动机 座椅 轮胎 是汽车的一个产品族
抽象工厂模式是工厂模式的一种特殊版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
1.创建高低端产品族的接口和实现类
/**
* 创建汽车产品族中的发动机接口
* @author CL
*
*/
public interface Engine {
void run();
void start();
} /**
* 高端发动机实现类
*/
class LuxuryEngine implements Engine { public void run() {
System.out.println("转速高!");
} public void start() {
System.out.println("可以自动启停!");
} } /**
* 低端发动机实现类
*/
class LowEngine implements Engine {
public void run() {
System.out.println("转速慢!");
} public void start() {
System.out.println("不可以自动启停!");
} }
/**
* 创建汽车产品族中的座椅接口
* @author CL
*
*/
public interface Seat {
void massage();
} /**
* 高端座椅的实现类
*/
class LuxurySeat implements Seat { public void massage() {
System.out.println("可以按摩!");
} } /**
* 低端座椅的实现类
*/
class LowSeat implements Seat { public void massage() {
System.out.println("不可以按摩!");
} }
/**
* 创建汽车产品族的轮胎接口
* @author CL
*
*/
public interface Tyre {
void abrasion();
} /**
* 高端轮胎的实现类
*/
class LuxuryTyre implements Tyre { public void abrasion() {
System.out.println("磨损慢!");
} } /**
* 低端轮胎的实现类
*/
class LowTyre implements Tyre { public void abrasion() {
System.out.println("磨损快!");
} }
2.创建高端汽车工厂和低端汽车工厂
/**
* 创建高端汽车的实现类工厂
* @author CL
*
*/
public class LuxuryCarFactory implements CarFactory { /**
* 制造高端发动机
*/
public Engine creatEngine() {
return new LuxuryEngine();
} /**
* 制造高端座椅
*/
public Seat creatSeat() {
return new LuxurySeat();
} /**
* 制造高端轮胎
*/
public Tyre creatTyre() {
return new LuxuryTyre();
} }
/**
* 创建低端汽车的实现类工厂
* @author CL
*
*/
public class LowCarFactory implements CarFactory { /**
* 制造低端发动机
*/
public Engine creatEngine() {
return new LowEngine();
} /**
* 制造低端座椅
*/
public Seat creatSeat() {
return new LowSeat();
} /**
* 制造低端轮胎
*/
public Tyre creatTyre() {
return new LowTyre();
} }
3.测试
/**
* 使用抽象工厂模式创建高端汽车发动机
* 创建低端汽车轮胎
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//需要低端发动机
CarFactory factory = new LowCarFactory();
Engine e = factory.creatEngine();
e.run();
e.start(); System.out.println("----------------"); //需要高端轮胎
CarFactory carFactory = new LuxuryCarFactory();
Tyre t = carFactory.creatTyre();
t.abrasion();
} }
控制台输出:
转速慢!
不可以自动启停!
----------------
磨损慢!
六、如何选择工厂模式
实际应用:简单工厂模式
增加产品:工厂方法模式
增加产品族:抽象工厂模式
七、工厂模式常见应用场景
(1)JDK中Calendar的getInstance方法;
(2)JDBC中Connection对象的获取;
(3)Hibernate中sessionFactory创建Session;
(4)Spring中IOC容器创建管理bean对象;
(5)XML解析时的DocumentBuilderFactory创建解析器对象;
(6)反射中Class对象的newInstance();
(7)………………
GOF23设计模式之工厂模式(factory)的更多相关文章
- 设计模式之工厂模式(Factory)
设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- 【GOF23设计模式】工厂模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_简单工厂模式详解.面向对象设计原则.开闭原则.依赖反转原则.迪米特法则 没有工厂模式的情况 package com.te ...
- 设计模式之工厂模式(Factory模式)
在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...
- 设计模式~简单工厂模式(Factory)
简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类 ...
- 【GOF23设计模式】--工厂模式
工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- 设计模式之工厂模式 Factory实现
simpleFactory //car接口 public interface Car { void run(); } //两个实现类 public class Audi implements Car{ ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
随机推荐
- Divide two numbers,两数相除求商,不能用乘法,除法,取模运算
问题描述:求商,不能用乘法,除法,取模运算. 算法思路:不能用除法,那只能用减法,但是用减法,超时.可以用位移运算,每次除数左移,相当于2倍. public class DividTwoInteger ...
- Linux集群的NTP服务器时间同步
我们搭建集群环境的时候,时间必须是要统一的,才能保证集群数据的一致性. 一般操作是直接使用NTP,跟默认的时间服务器同步,但是最好还是让所有节点跟集群中的某台作为时间服务器的节点同步. 步骤:(节点有 ...
- Treflection05_扩展习题
1. package reflectionZ; import java.lang.reflect.Constructor; import java.lang.reflect.Method; publi ...
- js 小复习1
1.数组 增删改查 , , , , ]; // arr.push(18); // 添加数组后面 更改长度 // arr.unshift(12); // 添加数组前面 // arr.pop(); // ...
- "Entity Framework数据插入性能追踪"读后总结
园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个 ...
- selenium学习笔记(简单的元素定位)
收拾一下心情开始新的一周工作 继续是selenium的学习.配置成功后 由于所有操作都是建立在页面元素基础上的.所以下来就是学习定位元素 首先是基础的定位.就使用博客园首页搜索框为例: 下面是代码: ...
- spring3: AOP 之代理机制
Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理.CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理. JDK动态代理:使用java.lang.reflect ...
- GO学习笔记:函数Panic和Recover
Go没有像Java那样的异常机制,它不能抛出异常,而是使用了panic和recover机制.一定要记住,你应当把它作为最后的手段来使用,也就是说,你的代码中应当没有,或者很少有panic的东西.这是个 ...
- 关于shortcut icon和icon代码的区别介绍
语句一:<link rel="shortcut icon" href="favicon.ico" /> 语句二:<link rel=" ...
- Redis 数据备份与恢复,安全,性能测试,客户端连接,管道技术,分区(四)
Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 re ...