Java 工厂模式
前言
工厂模式有三种,分别是简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式
-
概念:定义一个工厂,根据传入的参数返回不同的实例,被创建的实例拥有共同的父类或接口。
-
使用场景:需要创建的对象较少、客户端不关心对象的创建过程。
-
使用实例:使用简单工厂模式创建一个可以绘制不同形状的绘图工具,绘图工具有一个绘图方法。
-
创建绘图接口Drawer,声明绘制空方法draw()。
public interface Drawer { void draw(); }
-
创建若干绘图类,以绘制不同的图像,并实现
Shape
接口。public class CircleDrawer implements Shape { public CircleDrawer() { Log.d("CircleDrawer: created"); } @Override public void draw() { Log.d("CircleDrawer: draw()"); } }
-
创建绘制工厂类,根据传入参数的不同返回的绘图类。
public class DrawFactory { public static Drawer getDrawer(String type) { Drawer drawer = null; if (type.equals("circle")) { return new CircleDrawer(); } return drawer; } }
-
使用工厂类获取圆形工厂,并进行绘制。
Drawer drawer = DrawFactory.getDrawer("type"); drawer.draw();
-
工厂方法模式
-
概念:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
工厂方法模式在原有的简单方法模式的基础上,要求针对不同的对象提供不同的工厂,而不是使用一个工厂构造不同类型的对象。
-
使用场景:客户端不需要知道它所创建的对象的类、客户端可以通过子类来指定创建对应的对象。
-
使用实例:
1、2步骤不变。
-
创建一个抽象的绘制工厂接口DrawFactory
public interface DrawFactory { Drawer getDrawer(); }
-
根据绘图类的实际情况,创建对应的绘图类工厂
public class CircleDrawerFactory implements DrawFactory { @Override public Drawer getDrawer() { return new CircleDrawer(); } }
-
使用圆形工厂类获取工厂,进行绘制。
Drawer drawer = new CircleDrawerFactory().getDrawer(); drawer.draw();
-
抽象工厂模式
- 概念:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象。抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
- 适用场景:
(1)和工厂方法一样客户端不需要知道它所创建的对象的类。
(2)需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况。
(3)系统结构稳定,不会频繁的增加对象。(因为一旦增加就需要修改原有代码,不符合开闭原则)