设计模式(三):抽象工厂模式
- 1. 抽象工厂模式的介绍
- 2. 抽象工厂模式的类图
- 3. 抽象工厂模式的实现
- 3.1 创建摩托车的接口
- 3.2 创建摩托车的具体实现
- 3.3 创建汽车的接口
- 3.4 创建汽车的具体产品
- 3.5 创建抽象工厂
- 3.6 创建具体工厂
- 3.7 创建工厂生成器
- 3.8 使用工厂生成器获取工厂,通过工厂获取产品
1. 抽象工厂模式的介绍
抽象工厂模式
(Abstract Factory Pattern)属于创建型模式,是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
在抽象工厂模式
中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
通过使用抽象工厂模式
,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。
抽象工厂模式
包含4个核心角色:
- 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
- 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
- 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
2. 抽象工厂模式的类图
3. 抽象工厂模式的实现
3.1 创建摩托车的接口
package blog;/*** 摩托车*/
public interface Motorcycle {void by();
}
3.2 创建摩托车的具体实现
package blog;/*** 踏板摩托车*/
public class Scooter implements Motorcycle{@Overridepublic void by() {System.out.println("骑着一辆踏板车");}
}
package blog;/*** 弯梁摩托车*/
public class UnderBone implements Motorcycle{@Overridepublic void by() {System.out.println("骑着一辆弯梁车");}
}
3.3 创建汽车的接口
package blog;/*** 汽车*/
public interface Car {void drive();
}
3.4 创建汽车的具体产品
package blog;/*** suv*/
public class Suv implements Car{@Overridepublic void drive() {System.out.println("开着一辆SUV");}
}
package blog;/*** mpv*/
public class Mpv implements Car{@Overridepublic void drive() {System.out.println("开着一辆MPV");}
}
3.5 创建抽象工厂
package blog;/*** 抽象工厂*/
public interface AbstractFactory {Car getCar(String type);Motorcycle getMotorCycle(String type);
}
3.6 创建具体工厂
package blog;/*** 摩托车工厂*/
public class MotorCycleFactory implements AbstractFactory {@Overridepublic Car getCar(String type) {return null;}@Overridepublic Motorcycle getMotorCycle(String type) {try {Class<?> aClass = Class.forName(type);return (Motorcycle) aClass.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException(e);}}
}
package blog;/*** 汽车工厂*/
public class CarFactory implements AbstractFactory {@Overridepublic Car getCar(String type) {try {Class<?> aClass = Class.forName(type);return (Car)aClass.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic Motorcycle getMotorCycle(String type) {return null;}
}
3.7 创建工厂生成器
package blog;/*** 工厂生成器*/
public class FactoryProducer {public static AbstractFactory getFactory(String type) {if ("car".equals(type)) {return new CarFactory();}if ("motorcycle".equals(type)) {return new MotorCycleFactory();}return null;}
}
3.8 使用工厂生成器获取工厂,通过工厂获取产品
package blog;public class AbstractFactoryDemo {public static void main(String[] args) {// 获取汽车工厂AbstractFactory carFactory = FactoryProducer.getFactory("car");// 获取suvCar suv = carFactory.getCar("blog.Suv");suv.drive();// 获取mpvCar mpv = carFactory.getCar("blog.Mpv");mpv.drive();// 获取摩托车工厂AbstractFactory motorcycleFactory = FactoryProducer.getFactory("motorcycle");// 获取scooterMotorcycle scooter = motorcycleFactory.getMotorCycle("blog.Scooter");scooter.by();// 获取UnderBoneMotorcycle underBone = motorcycleFactory.getMotorCycle("blog.UnderBone");underBone.by();}
}