设计模式之工厂模式
时间:2022-07-22
本文章向大家介绍设计模式之工厂模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式
设计模式总分类
创建型模式( 5种 )
- 单例模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
- 原型模式
结构型模式( 7种 )
- 适配器模式
- 桥接模式
- 装饰模式
- 组合模式
- 外观模式
- 享元模式
- 代理模式
行为型模式( 11种 )
- 模版方法模式
- 命令模式
- 迭代器模式
- 观察者模式
- 中介者模式
- 备忘录模式
- 解释器模式
- 状态模式
- 策略模式
- 职责链模式
- 访问者模式
工厂模式
应用场景
作用
实现了创建者和调用者的分离。
本质
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 实例化对象,用工厂方法代替new操作。
教你区别内聚与耦合
补充 面向对象设计的基本原则
项目 |
Value |
---|---|
OCP(开闭原则,Open-Closed Principle) |
一个软件的实体应当对扩展开放,对修改关闭。 |
DIP(依赖倒转原则,Dependence Inversion Principle) |
要针对接口编程, 不要针对实现编程。 |
LoD(迪米特法则,Law of Demeter ) |
只与你直接的朋友通信,而避免和 陌生人通信。 |
分类
简单工厂模式
用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码 )
基础类
package ah.szxy.simplefactory;
public interface car {
void run();
}
package ah.szxy.simplefactory;
public class BenChi implements car{
@Override
public void run() {
System.out.println("奔驰在跑");
}
}
package ah.szxy.simplefactory;
public class BaoMa implements car{
@Override
public void run() {
System.out.println("宝马在跑");
}
}
工厂类以及测试类
package ah.szxy.simplefactory;
/**
* 简单工厂模式一
* @author chy
*
*/
public class CarFactory {
public static car createCar(String type) {
if ("BaoMa".equals(type)) {
return new BaoMa();
}else if ("BenChi".equals(type)) {
return new BenChi();
}else {
return null;
}
}
}
package ah.szxy.simplefactory;
/**
* 简单工厂模式二
* @author chy
*
*/
public class CarFactory2 {
public static car createBenChi() {
return new BenChi();
}
public static car createBaoMa() {
return new BaoMa();
}
}
package ah.szxy.simplefactory;
/**
* 测试简单工厂模式
* @author chy
*
*/
public class Client2 {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
//car bc = carFactory.createCar("BenChi");
//car bm = carFactory.createCar("BaoMa");
car bm = CarFactory2.createBaoMa();
car bc = CarFactory2.createBenChi();
bc.run();
bm.run();
}
}
uml图
工厂方法模式
为了避免简单工厂模式的缺点,不完全满足OCP。 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目 或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
package ah.szxy.simplefactory;
public interface car {
void run();
}
package ah.szxy.simplefactory;
public class BenChi implements car{
@Override
public void run() {
System.out.println("奔驰在跑");
}
}
package ah.szxy.simplefactory;
public class BaoMa implements car{
@Override
public void run() {
System.out.println("宝马在跑");
}
}
package ah.szxy.factorymethod;
public interface Factory {
public Car createCar();
}
package ah.szxy.factorymethod;
public class BenChiFactory implements Factory{
@Override
public Car createCar() {
return new BenChi();
}
}
package ah.szxy.factorymethod;
public class BaoMaFactory implements Factory{
@Override
public Car createCar() {
return new BaoMa();
}
}
package ah.szxy.factorymethod;
/**
* 测试工厂方法模式
* @author 曹海洋
*
*/
public class Client{
public static void main(String[] args) {
Car bc = new BenChiFactory().createCar();
Car bm = new BaoMaFactory().createCar();
bc.run();
bm.run();
}
}
测试结果
uml图
简单工厂模式和抽象工厂模式比较
根据设计理论建议:工厂方法模式。但实际上,我们一般都用简单工厂模式
抽象工厂模式
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力; 支持增加产品族) 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务 分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
package ah.szxy.abstractfactory;
/**
* 引擎
* @author chy
*
*/
public interface Engine {
void run();
}
class luxuryEngine implements Engine{
@Override
public void run() {
System.out.println("跑的快");
}
}
class lowEngine implements Engine{
@Override
public void run() {
System.out.println("跑的慢");
}
}
package ah.szxy.abstractfactory;
/**
* 座位
* @author chy
*
*/
public interface Seat {
void feel();
}
class luxurySeat implements Seat{
@Override
public void feel() {
System.out.println("坐着爽");
}
}
class lowSeat implements Seat{
@Override
public void feel() {
System.out.println("坐着不爽");
}
}
package ah.szxy.abstractfactory;
/**
* 轮胎
* @author chy
*
*/
public interface Tyre {
void moSun();
}
class luxuryTyre implements Tyre{
@Override
public void moSun() {
System.out.println("耐磨损");
}
}
class lowTyre implements Tyre{
@Override
public void moSun() {
System.out.println("不耐磨损");
}
}
package ah.szxy.abstractfactory;
public interface CarFactory {
Engine engine();
Seat seat();
Tyre tyre();
}
package ah.szxy.abstractfactory;
public class lowCar implements CarFactory{
@Override
public Engine engine() {
return new lowEngine();
}
@Override
public Seat seat() {
return new lowSeat();
}
@Override
public Tyre tyre() {
return new lowTyre();
}
}
package ah.szxy.abstractfactory;
public class LuxuryCar implements CarFactory {
@Override
public Engine engine() {
return new luxuryEngine();
}
@Override
public Seat seat() {
return new luxurySeat();
}
@Override
public Tyre tyre() {
return new luxuryTyre() ;
}
}
package ah.szxy.abstractfactory;
/**
* 测试抽象方法模式
* @author chy
*
*/
public class Client {
public static void main(String[] args) {
CarFactory luxuryCar = new LuxuryCar();
CarFactory lowCar = new lowCar();
luxuryCar.engine().run();
lowCar.engine().run();
}
}
运行结果
uml类图
工厂模式总结
分类 |
区别 |
---|---|
简单工厂模式(静态工厂模式) |
虽然某种程度不符合设计原则,但实际使用最多。 |
工厂方法模式 |
不修改已有类的前提下,通过增加新的工厂类实现扩展。 |
抽象工厂模式 |
不可以增加产品,可以增加产品族 |
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法