工厂模式和简单工厂模式,工厂模式与简单工厂模式的区别

首页 > 生活 > 作者:YD1662024-06-03 07:26:10

工厂模式和简单工厂模式,工厂模式与简单工厂模式的区别(1)

简单工厂

简单工厂模式并不属于GoF提出的23种设计模式之一,它只适用于客户端知道传入工厂类的参数,对于如何创建对象的逻辑不关心的情况。

简单工厂模式没有被列入23种设计模式的原因主要有以下两点:

GoF的设计模式列表中,工厂模式是分为工厂方法模式和抽象工厂模式的。他们在不同的场景和需求下,提供了更为强大和灵活的解决方案。相比之下,简单工厂模式在功能上较为基础,没能提供足够的设计和扩展能力。

简单工厂模式的弊端是,一旦需要添加新产品时,就需要修改工厂类的逻辑。这违反了"开闭原则",即软件实体应当对扩展开放,对修改封闭。这是GoF提倡的重要原则之一。

简单工厂模式也叫静态工厂模式,它是一种最简单的工厂模式。在简单工厂中,工厂类包含必要的判断逻辑,根据客户端的选择条件动态实例化相关的类。对于客户端来说,除了选择参数无需关心更多的逻辑。

简单工厂模式的基本结构通常包含以下三个要素:

  1. 工厂(Factory)类:这是实现了工厂功能的类,它包含一个创建产品对象的方法,在该方法中包含了创建产品对象的逻辑。
  2. 抽象产品(Product)类:这是定义产品的接口,规范了产品的主要功能。
  3. 具体产品(ConcreteProduct)类:这是实现了产品接口的具体类,这些类的对象会被工厂类创建。

下面是一个简单工厂模式的例子,在这个例子中,有一个枚举类型 AnimalType(包括 CAT DOG 两种类型),有一个 Animal 接口和两个实现这个接口的类 Cat Dog。然后建立一个工厂 AnimalFactory,它可以根据 AnimalType 来生成相应的对象。

// 先定义一个动物接口 public interface Animal { void say(); } // 实现Cat类 public class Cat implements Animal { @Override public void say() { System.out.println("Meow!"); } } // 实现Dog类 public class Dog implements Animal { @Override public void say() { System.out.println("Woof!"); } } // Animal类型的枚举 public enum AnimalType { CAT, DOG } // Animal的工厂类 public class AnimalFactory { public static Animal create(AnimalType animalType) { switch (animalType) { case CAT: return new Cat(); case DOG: return new Dog(); default: throw new IllegalArgumentException("Invalid animal type"); } } }工厂方法

"工厂方法"这个名字来自于这个设计模式的形式和操作。在工厂方法模式中,通过一个方法(即“工厂方法”)来创建对象,而这个方法通常会被设计为一个接口,让具体的子类去实现。这就如同一个"工厂"生产产品一样,"工厂方法"是生产对象的地方。

工厂方法模式是一种创建型设计模式,其主要思想是定义一个创建对象的接口(工厂方法),让子类决定实例化哪一个类。这种模式把类对象的创建过程完全由子类负责,这样可以让对象创建的代码和具体使用的代码相分离,降低了系统的耦合度,提高了代码的灵活性和可维护性。

工厂模式和简单工厂模式,工厂模式与简单工厂模式的区别(2)

工厂方法模式举例

图中,LogFactory(日志工厂)是一个抽象的创建者,它定义了一个createLog()方法,用于创建一个类型为Log的对象。FileLogFactory(文件日志工厂)和DatabaseLogFactory(数据库日志工厂)则是LogFactory的具体实现,它们实现了createLog()方法,分别创建FileLog(文件日志)和DatabaseLog(数据库日志)这两种具体的产品。

Log是产品的抽象接口,定义了writeLog()(写日志)方法,不同类型的日志将实现这个方法。Client(客户端)通过LogFactory来创建一个Log实例,具体是哪种类型的Log,取决于实例化的是哪种工厂。这样一来,如果想要引入新类型的日志,我们只需要新增一个具体的日志工厂,不需要改动客户端的代码,这是符合开闭原则的设计方式。

抽象工厂

在抽象工厂模式中,抽象工厂类(Abstract Factory)不参与具体的产品创建,它提供的是一种创建产品的通用接口,这些产品形成一个产品家族。具体产品的创建过程由具体工厂( Concrete Factories)来完成。这就好比一个抽象的工厂概念,不生产产品,而是规定了生产各类产品的通用流程和方法,把真正的生产任务交给具体的工厂去执行。

工厂模式和简单工厂模式,工厂模式与简单工厂模式的区别(3)

抽象工厂产品族举例

工厂模式和简单工厂模式,工厂模式与简单工厂模式的区别(4)

抽象工厂举例

图中,工厂类(ConcreteFactory1ConcreteFactory2)都实现了一个抽象工厂接口( AbstractFactory),负责实例化一组具体的产品对象(ProductAProductB)。每个工厂类负责一个产品族的创建,比如ConcreteFactory1负责创建产品ConcreteProductA1及产品ConcreteProductB1,这两个产品均属于同一个产品族。

工厂方法和抽象工厂对比

工厂方法模式主要负责解决接口和实现类之间的依赖关系。在工厂方法模式中,客户端直接与抽象工厂接口打交道,工厂类具体实现这个接口,并负责创建具体的产品对象。本质是解耦,将类的实例化交给子类完成,只需考虑单个产品的生产情况,不需要考虑整个产品族和产品等级结构。

抽象工厂模式主要用于解决系统中有多个产品族的问题。其中每个具体工厂负责创建一整个产品族的产品,这可以确保客户端始终只使用同一个产品族的产品。同时,抽象工厂模式还支持添加新的产品族,而无需修改已有的代码,这使得抽象工厂模式具有更好的扩展性。这样就解决了相同产品族的换成问题。例如在不同的操作系统中换皮肤,只需要改变一次工厂,就可以将所有的皮肤一次性全部改变。

工厂方法模式和抽象工厂模式都能够提供一个创建接口,实现业务逻辑与具体实现的解耦。不过,工厂方法模式关注的是单一产品等级结构的创建,而抽象工厂模式关注的是产品族和产品等级结构的创建

配图来源:

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.