2025年设计模式创建型——工厂模式

设计模式创建型——工厂模式目录 什么是工厂模式 工厂模式的实现 简单工厂模式 简单工厂模式角色 简单工厂模式类图 简单工厂模式代码实现 工厂方法模式 工厂方法模式角色 工厂方法模式类图 工厂方法模式代码实现 工厂模式的特点 优点 缺点 使用场景 注意事项 什么是工厂模式 工程模式是通过工厂获取一个一个的新对象

大家好,我是讯享网,很高兴认识大家。

目录

什么是工厂模式

工厂模式的实现

简单工厂模式

简单工厂模式角色

简单工厂模式类图

简单工厂模式代码实现

工厂方法模式

工厂方法模式角色

工厂方法模式类图 

工厂方法模式代码实现

工厂模式的特点

优点

缺点

使用场景

注意事项


什么是工厂模式

        工程模式是通过工厂获取一个一个的新对象。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。


讯享网

工厂模式的实现

简单工厂模式

        简单工厂模式(Simple Factory Pattern)是属于创建型模式,又叫做静态工厂方法(Static Factory Method Pattern)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

简单工厂模式角色

  1. Factory(工厂角色)工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
  2. Product(抽象产品角色)抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
  3. ConcreteProduct(具体产品类)具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。

简单工厂模式类图

PS:图中fruit 为抽象产品角色,apple,pear,orange是具体产品类,factory是工厂角色。

简单工厂模式代码实现

抽象产品角色:

/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 13:41:41 */ public interface Fruit { String getColor(); }

讯享网

实际产品角色:

讯享网/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 13:41:41 */ public class Apple implements Fruit{ @Override public String getColor() { return "红色"; } } public class Orange implements Fruit{ @Override public String getColor() { return "橙色"; } } public class Pear implements Fruit{ @Override public String getColor() { return "黄色"; } }

工厂角色:

/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 13:44:44 */ public class FruitFactory { public Fruit createFruit(String fruitType) { if(fruitType.equalsIgnoreCase("Apple")){ return new Apple(); } else if(fruitType.equalsIgnoreCase("Orange")) { return new Orange(); }else if(fruitType.equalsIgnoreCase("Pear")){ return new Pear(); } return null; } }

测试:

讯享网/ * @author Evan Walker * @version 1.0 * @desc * @date 2023/04/04 14:02:43 */ public class Test { public static void main(String[] args) { FruitFactory fruitFactory = new FruitFactory(); Fruit fruit = fruitFactory.createFruit("Orange"); System.out.println(fruit.getColor()); fruit = fruitFactory.createFruit("Apple"); System.out.println(fruit.getColor()); fruit = fruitFactory.createFruit("Pear"); System.out.println(fruit.getColor()); } }

工厂方法模式

工厂方法模式角色

  1. 抽象工厂角色(Abstract Factory):描述具体工厂的公共接口,是具体工厂的父类。
  2. 具体工厂角色(Concrete Factory):描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品角色(Product):抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
  4. 具体产品角色(Concrete Product):具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法,由具体工厂来创建,它同具体工厂之间一一对应。

工厂方法模式类图 

工厂方法模式代码实现

抽象产品角色:

/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 14:31:33 */ public interface Fruit { String getColor(); String getTaste(); }

具体产品角色

讯享网/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 14:45:27 */ public class Apple implements Fruit { @Override public String getColor() { return "红色"; } @Override public String getTaste() { return "好吃"; } } public class Pear implements Fruit { @Override public String getColor() { return "黄色"; } @Override public String getTaste() { return "吃了还想吃"; } } public class Orange implements Fruit { @Override public String getColor() { return "橙色"; } @Override public String getTaste() { return "美味"; } }

抽象工厂角色

import java.util.Objects; / * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 14:47:44 */ public abstract class FruitAbstractFactory { public Fruit createFruit(String fruitType) { if(Objects.isNull(fruitType)){ return null; } if(fruitType.equalsIgnoreCase("Apple")){ return new Apple(); } else if(fruitType.equalsIgnoreCase("Orange")) { return new Orange(); }else if(fruitType.equalsIgnoreCase("Pear")){ return new Pear(); } return null; } public abstract String getFruitColor(Fruit fruit); public abstract String getFruitTaste(Fruit fruit); } 

具体工厂角色

讯享网/ * @author Evan Walker * @version 1.0 * @desc 昂焱数据: https://www.ayshuju.com * @date 2023/04/04 14:49:48 */ public class FruitColorFactory extends FruitAbstractFactory{ @Override public String getFruitColor(Fruit fruit) { return fruit.getColor(); } @Override public String getFruitTaste(Fruit fruit) { return null; } } public class FruitTasteFactory extends FruitAbstractFactory{ @Override public String getFruitColor(Fruit fruit) { return null; } @Override public String getFruitTaste(Fruit fruit) { return fruit.getTaste(); } }

测试:

/ * @author Evan Walker * @version 1.0 * @desc * @date 2023/04/04 14:02:43 */ public class Test { public static void main(String[] args) { FruitColorFactory colorFactory = new FruitColorFactory(); FruitTasteFactory tasteFactory = new FruitTasteFactory(); Fruit fruitColor = colorFactory.createFruit("Orange"); Fruit fruitTaste = tasteFactory.createFruit("Orange"); System.out.print(fruitColor.getColor()); System.out.println(fruitTaste.getTaste()); fruitColor = colorFactory.createFruit("Apple"); fruitTaste = tasteFactory.createFruit("Apple"); System.out.print(fruitColor.getColor()); System.out.println(fruitTaste.getTaste()); fruitColor = colorFactory.createFruit("Pear"); fruitTaste = tasteFactory.createFruit("Pear"); System.out.print(fruitColor.getColor()); System.out.println(fruitTaste.getTaste()); } } 

工厂模式的特点

优点

  1. 一个调用者想创建一个对象,只需知道其名称。
  2. 扩展性高,如果想增加一个产品,只需扩展一个工厂类。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

  1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

使用场景

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  2. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

注意事项

  1.  作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

小讯
上一篇 2025-04-10 15:33
下一篇 2025-01-25 18:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/25433.html