目录
什么是工厂模式
工厂模式的实现
简单工厂模式
简单工厂模式角色
简单工厂模式类图
简单工厂模式代码实现
工厂方法模式
工厂方法模式角色
工厂方法模式类图
工厂方法模式代码实现
工厂模式的特点
优点
缺点
使用场景
注意事项
什么是工厂模式
工程模式是通过工厂获取一个一个的新对象。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
工厂模式的实现
简单工厂模式
简单工厂模式(Simple Factory Pattern)是属于创建型模式,又叫做静态工厂方法(Static Factory Method Pattern)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂模式角色
- Factory(工厂角色)工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
- Product(抽象产品角色)抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
- 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()); } }

工厂方法模式
工厂方法模式角色
- 抽象工厂角色(Abstract Factory):描述具体工厂的公共接口,是具体工厂的父类。
- 具体工厂角色(Concrete Factory):描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品角色(Product):抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
- 具体产品角色(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()); } }

工厂模式的特点
优点
- 一个调用者想创建一个对象,只需知道其名称。
- 扩展性高,如果想增加一个产品,只需扩展一个工厂类。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
使用场景
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
注意事项
- 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

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