Java学设计模式之工厂模式(含抽象工厂)
一、工厂模式概念
1.1 什么是代理模式
工厂模式是一种创建型设计模式,用于创建对象而不需要暴露对象的创建逻辑。它将对象的实例化过程封装在一个单独的类中,使得客户端代码只需通过调用工厂类的方法来获取所需的对象,而无需关心具体的实例化过程。
工厂模式通常有三种主要的变体:简单工厂模式、工厂方法模式和抽象工厂模式。
-
简单工厂模式(Simple Factory Pattern):由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
-
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
-
抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。
1.2 工厂模式架构示意图
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
工厂方法模式与抽象工厂模式的区别在于:
-
工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。
-
抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例
二、简单工厂模式代码
2.1 公共接口
public abstract class Color {
public Color() {
}
}
2.2 产品类
public class Blue extends Color {
public Blue() {
System.out.println("获得蓝色");
}
}
public class Red extends Color {
public Red() {
System.out.println("获得红色");
}
}
2.3 工厂类
public class ColorFactory {
public Color getColor(String color) {
switch (color) {
case "blue":
return new Blue();
case "red":
return new Red();
default:
break;
}
return null;
}
}
2.4 测试类
public class FactoryPatternTest {
public static void main(String[] args) {
ColorFactory colorFactory = new ColorFactory();
Color red = colorFactory.getColor("red");
// 输出:获得红色
}
}
三、工厂方法代码
3.1 公共产品接口
public abstract class Color {
public Color() {
}
}
3.2 产品实现类
public class Blue extends Color {
public Blue() {
System.out.println("获得蓝色");
}
}
public class Red extends Color {
public Red() {
System.out.println("获得红色");
}
}
3.3 公共工厂接口
public interface ColorFactory {
Color getColor();
}
3.4 工厂实现类
public class BlueFactory implements ColorFactory{
@Override
public Blue getColor() {
return new Blue();
}
}
public class RedFactory implements ColorFactory{
@Override
public Red getColor() {
return new Red();
}
}
3.5 测试类
public class FactoryPatternTest {
public static void main(String[] args) {
RedFactory redFactory = new RedFactory();
redFactory.getColor();
// 输出:获得红色
BlueFactory blueFactory = new BlueFactory();
blueFactory.getColor();
// 输出:获得蓝色
}
}
四、抽象工厂代码
4.1 公共产品接口
public interface Color {
}
public interface Size {
}
4.2 产品实现类
public class Red implements Color {
public Red() {
System.out.println("获得颜色红色");
}
}
public class Blue implements Color {
public Blue() {
System.out.println("获得颜色蓝色");
}
}
public class Big implements Size{
public Big() {
System.out.println("获得尺寸大号");
}
}
public class Small implements Size{
public Small() {
System.out.println("获得尺寸小号");
}
}
4.3 公共工厂接口
public abstract class AbstractFactory {
public abstract Color getColor();
public abstract Size getSize();
}
4.4 工厂实现类
public class AFactory extends AbstractFactory {
@Override
public Color getColor() {
return new Blue();
}
@Override
public Size getSize() {
return new Big();
}
}
public class BFactory extends AbstractFactory {
@Override
public Color getColor() {
return new Red();
}
@Override
public Size getSize() {
return new Small();
}
}
4.5 测试类
public class FactoryPatternTest {
public static void main(String[] args) {
AFactory aFactory = new AFactory();
aFactory.getColor();
aFactory.getSize();
// 输出:获得颜色蓝色
// 输出: 获得尺寸大号
BFactory bFactory = new BFactory();
bFactory.getColor();
bFactory.getSize();
// 输出:获得颜色红色
// 输出:获得尺寸小号
}
}
五、总结
工厂模式在实际开发中经常被使用,它将对象的创建过程与客户端代码分离,提高了代码的可维护性和可扩展性。
参考资料