java设计模式 - 工厂模式

简介: java设计模式 - 工厂模式

一、简介


工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式有三种:简单工厂模式、工厂方法模式、抽象工厂模式。

二、简单工厂模式


简单工厂模式由三类角色组成:抽象产品、具体产品、工厂类。

 抽象产品(宝马):

public abstract class BMW {
/**
* 宝马介绍
*/
abstract void introduce();
}

 具体产品(宝马三系、宝马五系):

 public class BMW320 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马三系");
 }
 }
 public class BMW525 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马五系");
 }
 }

 工厂类(宝马三五系生产车间):

public class BMWFactory {
/**
* 宝马生产
*
* @param type 宝马型号
* @return 宝马
*/
public static BMW makeBMW(int type) {
switch (type) {
case 320:
return new BMW320();
case 525:
return new BMW525();
default:
break;
}
return null;
}
}

调用:

 public class Customer {
 public static void main(String[] args) {
 // 生产宝马三系
 BMW bmw320 = BMWFactory.makeBMW(320);
 // 生产宝马五系
 BMW bmw525 = BMWFactory.makeBMW(525);
 }
 }

优点:

1、将产品交由工厂创建,使用方无需关心产品创建细节,实现了创建与使用的解耦。

缺点:

1、违背 “开闭原则”(对扩展开放,对修改封闭),新增产品(宝马七系)不得不修改工厂类逻辑。

三、工厂方法模式


工厂方法模式由四类角色组成:抽象产品、具体产品、抽象工厂、具体工厂。

 抽象产品(宝马):

public abstract class BMW {
/**
* 宝马介绍
*/
abstract void introduce();
}

 具体产品(宝马三系、宝马五系):

 public class BMW320 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马三系");
 }
 }
 public class BMW525 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马五系");
 }
 }

  抽象工厂(宝马生产车间):

public abstract class Factory {
/**
* 宝马生产
*
* @return 宝马
*/
abstract BMW makeBMW();
}

 具体工厂(宝马三系生产车间、宝马五系生产车间):

 public class BMW320Factory extends Factory {
 @Override
 BMW makeBMW() {
 return new BMW320();
 }
 }
 public class BMW525Factory extends Factory {
 @Override
 BMW makeBMW() {
 return new BMW525();
 }
 }

 调用:

public class Customer {
public static void main(String[] args) {
// 生产宝马三系Factory bMW320Factory = new BMW320Factory();
BMW bmw320 = bMW320Factory.makeBMW();
// 生产宝马五系
Factory bMW525Factory = new BMW525Factory();
BMW bmw525 = bMW525Factory.makeBMW();
}
}

优点:


1、符合 “开闭原则”(对扩展开放,对修改封闭),新增产品(宝马七系)只需新增具体产品类和具体工厂类即可。


2、符合 “单一职责原则”,每个具体工厂类只负责创建对应的产品。


缺点:


1、系统复杂度增加:新增产品(宝马七系),类的个数成对增加(宝马七系 + 宝马七系生产车间)。


2、系统抽象性和理解难度增加。


3、具体工厂只能创建一类产品(宝马类)。

四、抽象工厂模式


抽象工厂模式由五类角色组成:抽象产品族、抽象产品、具体产品、抽象工厂、具体工厂。

 抽象产品族(汽车):

public abstract class Car {
/**
* 汽车介绍
*/
abstract void introduce();
}

抽象产品(宝马、奔驰):

public abstract class BMW extends Car {
/**
* 宝马介绍
*/
@Override
abstract void introduce();
}
public abstract class Benz extends Car {
/**
* 奔驰介绍
*/
@Override
abstract void introduce();
}

具体产品(宝马三系、宝马五系、奔驰C级、奔驰E级):

 public class BMW320 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马三系");
 }
 }
 public class BMW525 extends BMW {
 @Override
 void introduce() {
 System.out.println("宝马五系");
 }
 }
 public class BenzC extends Benz {
 @Override
 void introduce() {
 System.out.println("奔驰C级");
 }
 }
 public class BenzE extends Benz {
 @Override
 void introduce() {
 System.out.println("奔驰E级");
 }
 }

  抽象工厂(汽车生产车间):

public abstract class Factory {
/**
* 宝马生产
*
* @return 汽车
*/
abstract Car makeBMW();
/**
* 奔驰生产
*
* @return 汽车
*/
abstract Car makeBenz();
}

 具体工厂(宝马三系+奔驰C级生产车间、宝马五系+奔驰E级生产车间):

public class BMW320BenzCFactory extends Factory {
@Override
Car makeBMW() {
return new BMW320();
}
@Override
Car makeBenz() {
return new BenzC();
}
}public class BMW525BenzEFactory extends Factory {
@Override
Car makeBMW() {
return new BMW525();
}
@Override
Car makeBenz() {
return new BenzE();
}
}

 调用:

public class Customer {
public static void main(String[] args) {// 生产宝马三系+奔驰C级
Factory bMW320BenzCFactory = new BMW320BenzCFactory();
Car bmw320 = bMW320BenzCFactory.makeBMW();Car benzC = bMW320BenzCFactory.makeBenz();
// 生产宝马五系+奔驰E级
Factory bMW525BenzEFactory = new BMW525BenzEFactory();
Car bmw525 = bMW525BenzEFactory.makeBMW();
Car benzE = bMW525BenzEFactory.makeBenz();
}
}

优点:

1、符合 “开闭原则”(对扩展开放,对修改封闭)。

2、符合 “单一职责原则”。

缺点:

1、难以扩展新种类(奥迪)。

五、总结


抽象程度:

简单工厂模式 < 工厂方法模式 < 抽象工厂模式。

角色分类:

1、简单工厂模式:抽象产品、具体产品、工厂类。

2、工厂方法模式:抽象产品、具体产品、抽象工厂、具体工厂。

3、抽象工厂模式:抽象产品族、抽象产品、具体产品、抽象工厂、具体工厂。

相关文章
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
786 157
|
5月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
639 2
|
7月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
5月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1216 35
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
475 8
|
10月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
218 0
|
7月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
7月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
281 6