Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别

设计模式系列

创建型设计模式

Java 设计模式之单例模式

Java 设计模式之静态工厂方法模式

Java 设计模式之工厂方法模式

Java 设计模式之抽象工厂模式

Java 设计模式之Builder模式

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别

结构型设计模式

Java 设计模式之代理模式

Java 设计模式之外观模式

前言

前面几篇文章,我们依次学习分析了静态工厂方法模式、工厂方法模式、抽象工厂模式和 Builder 模式,我们发现他们 都可以用来得到一个产品 ,那他们有什么区别呢?当我们需要的时候,该怎么选择呢?

本讲我们来对比一下他们的区别。

定义的对比

我们先从前面几篇文章中拿来定义对比看看。

静态工厂方法模式:由一个工厂类对象决定创建哪一种产品类的实例。

工厂方法模式:定义一个用于创建产品对象的接口,让其子类决定实例化哪个产品类

抽象工厂模式:为创建一组相关或者相互依赖的产品对象提供一个接口,而不需要指定他们的具体类。

Builder 模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

我将定义中的关键处做了加粗。

UML图的对比

在前面几篇文章中,都提供的有示例,我们贴一下这些示例的 UML 图,对比一下。


图 1    静态工厂方法模式 示例的 UML 类图

静态工厂方法模式 示例的 UML 类图

图 2    工厂方法模式 示例的 UML 类图

工厂方法模式 示例的 UML 类图

图 3    抽象工厂模式 示例的 UML 类图

抽象工厂模式 示例的 UML 类图

图 4    Builder 模式 示例的 UML 类图

Builder 模式 示例的 UML 类图

总结

代码示例在前几篇文章里都有,这里就不贴了,还没看或者记不清楚的小伙伴自行翻回去熟悉。

下面我们结合定义、UML 图,及前面的代码,总结他们的区别。

我们之前有讲,静态工厂方法模式是工厂方法模式的精简版,其区别可以概括如下:
1、静态工厂方法模式,是在一个工厂类中,通过方法入参的不同生成不同的产品;
2、工厂方法模式,是有一个工厂的抽象类或者接口,由其子类生成具体的产品,且一个工厂子类只能生成一种产品。

那么,抽象工厂模式呢?实际上可以认为它是工厂方法模式的升级版。
1、工厂方法模式,包括静态工厂方法模式,都是用来生成独立的产品(不同工厂子类生成的产品间没有相关或者依赖关系);
2、抽象工厂模式,也是有一个工厂的抽象类或者接口,里面声明了一系列方法,用来规范 ”生产多个不同类型的、相关联或者相依赖的产品“ 的行为,再由其子类去实现这些方法(比如示例中的月饼皮和月饼馅,或者电脑的显示器和主板等)。

那这些工厂模式与 Builder 模式的区别呢?
1、工厂模式,关注的是创建的产品,即创建什么类型的产品;
2、Builder 模式,关注的是产品的创建过程,即怎么创建。
我们说 Builder 模式是将对象的构建与表示相分离。或许我们可以这样理解:Builder 模式侧重的是构建,而工厂模式侧重的是表示

后记

GOF 提出的 23 种设计模式中,创建型设计模式占了 5 种,分别为:单例模式、工厂方法模式、抽象工厂模式、Builder 模式、原型模式。原型模式我暂时没打算关注,下一讲我们学习 代理模式


感谢

  • 《Android源码设计模式解析与实战》 何红辉 关爱民
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实验目的 了解工厂方法抽象工厂模式的概念,理解它们的应用场景和优缺点,掌握Java语言实现这两种模式方法。 2. 实验内容 (1) 工厂方法模式 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定实例化哪个类。工厂方法模式将对象的实例化延迟到子类中进行,从而避免了在代码中直接使用new关键字来创建对象,使代码更加灵活。 具体实现步骤如下: 1. 定义一个抽象产品类Product和一个具体产品类ConcreteProduct。 ```java public abstract class Product { public abstract void doSomething(); } public class ConcreteProduct extends Product { @Override public void doSomething() { System.out.println("do something in ConcreteProduct"); } } ``` 2. 定义一个抽象工厂类Factory和一个具体工厂类ConcreteFactory,其中Factory中定义了一个抽象的工厂方法createProduct(),由子类来实现该方法创建具体的产品对象。 ```java public abstract class Factory { public abstract Product createProduct(); } public class ConcreteFactory extends Factory { @Override public Product createProduct() { return new ConcreteProduct(); } } ``` 3. 在客户端代码中使用工厂方法来创建产品对象,具体的对象类型由具体的工厂类来决定。 ```java public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(); product.doSomething(); } } ``` (2) 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的单独工厂抽象工厂模式可以帮助客户端代码创建一组相关的对象,而无需指定它们的具体类。 具体实现步骤如下: 1. 定义抽象产品类ProductA和ProductB以及它们的具体实现类ConcreteProductA和ConcreteProductB。 ```java public abstract class ProductA { public abstract void doSomething(); } public class ConcreteProductA extends ProductA { @Override public void doSomething() { System.out.println("do something in ConcreteProductA"); } } public abstract class ProductB { public abstract void doSomething(); } public class ConcreteProductB extends ProductB { @Override public void doSomething() { System.out.println("do something in ConcreteProductB"); } } ``` 2. 定义抽象工厂类AbstractFactory和具体工厂类ConcreteFactory1和ConcreteFactory2,其中AbstractFactory中定义了创建产品A和产品B的抽象方法createProductA()和createProductB(),由子类来实现这两个方法创建具体的产品对象。 ```java public abstract class AbstractFactory { public abstract ProductA createProductA(); public abstract ProductB createProductB(); } public class ConcreteFactory1 extends AbstractFactory { @Override public ProductA createProductA() { return new ConcreteProductA(); } @Override public ProductB createProductB() { return new ConcreteProductB(); } } public class ConcreteFactory2 extends AbstractFactory { @Override public ProductA createProductA() { return new ConcreteProductA(); } @Override public ProductB createProductB() { return new ConcreteProductB(); } } ``` 3. 在客户端代码中使用抽象工厂来创建一组相关的对象,具体的对象类型由具体的工厂类来决定。 ```java public class Client { public static void main(String[] args) { AbstractFactory factory = new ConcreteFactory1(); ProductA productA = factory.createProductA(); ProductB productB = factory.createProductB(); productA.doSomething(); productB.doSomething(); } } ``` 3. 实验总结 本次实验学习了工厂方法模式抽象工厂模式的概念、应用场景和实现方法,并通过Java语言编写了相应的代码进行了实现。工厂方法模式能够将对象的实例化延迟到子类中进行,提高了代码的灵活性;而抽象工厂模式则提供了一种方式来封装一组具有相同主题的单独工厂,帮助客户端代码创建一组相关的对象,而无需指定它们的具体类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值