Java 设计模式之工厂模式

it2026-02-16  8

Java 设计模式之工厂模式

工厂模式简单工厂模式代码案例 工厂方法模式代码案例 抽象工厂模式代码案例

工厂模式

定义:定义一个创建产品对象的工厂接口,让子类决定实例化哪个类,将产品对象的实际创建工作(也就是实例化)推迟到具体子工厂类当中。

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式

应用场景:

当产品种类相对较少的情况时,使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

优点:

工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。

工厂和产品的职责区分明确。客户端无需知道所创建具体产品的类名,只需知道参数即可。

缺点:

简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂。

代码案例

我们举一个生产玩具的例子,首先定义一个玩具接口Toy

//玩具接口 public interface Toy { public void show(); }

用此接口实现三个具体玩具类

public class toyCar implements Toy { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是一个玩具车!"); } } public class toyDuck implements Toy { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是一个玩具鸭!"); } } public class toyRobot implements Toy { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是玩具机器人!"); } }

接下来定义一个简单工厂

public class SimpleFactory { public Toy getToy(String name) { if ("car".equals(name)) { return new toyCar(); } else if ("duck".equals(name)) { return new toyDuck(); } else if ("robot".equals(name)) { return new toyRobot(); } else { return null; } } }

定义主类创建对象,测试一下效果

public class FactoryTest { public static void main(String[] args) { // TODO Auto-generated method stub // 简单工厂模式 System.out.println("简单工厂模式"); System.out.println("----------------"); Toy car = new SimpleFactory().getToy("car"); car.show(); Toy duck = new SimpleFactory().getToy("duck"); duck.show(); Toy robot = new SimpleFactory().getToy("robot"); robot.show(); }

运行结果

在用这种方法创建对象时,要创建一个对象只需要创建一个简单工厂传给其相应参数就可以创建出我们想要的对象,如果我们想要增加一个玩具对象,就必须修改SimpleFactory类,这破坏了“开闭原则”,接下来我们用工厂方法模式来解决这一问题。

工厂方法模式

应用场景:当我们明确地计划不同条件下创建不同实例时。

优点:

用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。

缺点:

类的个数容易过多,增加复杂度。增加了系统的抽象性和理解难度。抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

代码案例

仍然利用上述创建的三个玩具对象,接下来我们用工厂方法模式创建对象 这需要新建三个工厂类

public class toyCarFactory implements ToyFactory { @Override public Toy produce() { // TODO Auto-generated method stub return new toyCar(); } } public class toyDuckFactory implements ToyFactory { @Override public Toy produce() { // TODO Auto-generated method stub return new toyDuck(); } } public class toyRobot implements Toy { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是玩具机器人!"); } } public class FactoryTest { public static void main(String[] args) { // 工厂方法模式 System.out.println("工厂方法模式"); System.out.println("----------------"); Toy car1 = new toyCarFactory().produce(); car1.show(); Toy duck1 = new toyDuckFactory().produce(); duck1.show(); Toy robot1 = new toyRobotFactory().produce(); robot1.show(); } }

运行结果

这种方法解决了简单工厂模式扩展时需要修改原有类代码的问题,现在如果我们想要新增一种玩具,只需要新建一个生产该玩具的工厂类,而不必修改原有程序代码。

抽象工厂模式

应用场景:

工厂方法模式只考虑生产同种类的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多种类的产品,生产方式和生产难度大不相同,这时使用抽象工厂模式便能很好的解决。

优点:

可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

缺点:

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

代码案例

假如我们要实现生产小米和华为的手机和电脑的类的创建,接下来我们用抽象工厂模式完成这一创建过程。 定义一个手机接口

public interface Phone { public void show(); }

定义一个电脑接口

public interface PC { public void show(); }

实现小米手机的类

public class xiaomiPhone implements Phone { @Override public void show() { // TODO Auto-generated method stub System.out.println("小米手机"); } }

实现华为手机的类

public class huaweiPhone implements Phone { @Override public void show() { // TODO Auto-generated method stub System.out.println("华为手机"); } }

实现小米电脑的类

public class xiaomiPC implements PC { @Override public void show() { // TODO Auto-generated method stub System.out.println("小米笔记本"); } }

实现华为电脑的类

public class huaweiPC implements PC { @Override public void show() { // TODO Auto-generated method stub System.out.println("华为笔记本"); } }

定义一个抽象工厂接口

public interface AbstractFactory { public PC createPC();//生产笔记本 public Phone createPhone();//生产手机 }

实现生产小米产品的工厂

public class xiaomi implements AbstractFactory { @Override public PC createPC() { // TODO Auto-generated method stub return new xiaomiPC(); } @Override public Phone createPhone() { // TODO Auto-generated method stub return new xiaomiPhone(); } }

实现生产华为产品的工厂

public class huawei implements AbstractFactory { @Override public PC createPC() { // TODO Auto-generated method stub return new huaweiPC(); } @Override public Phone createPhone() { // TODO Auto-generated method stub return new huaweiPhone(); } }

定义测试类,创建相应的产品

public class TestDemo { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("抽象工厂模式"); System.out.println("----------------"); AbstractFactory f1 = new huawei(); f1.createPC().show(); f1.createPhone().show(); AbstractFactory f2 = new xiaomi(); f2.createPC().show(); f2.createPhone().show(); } }

运行结果

最新回复(0)