目录
使用 FactoryProducer 来获取 AbstractFactory
工厂模式
目的:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行,把对象的创建和使用的过程分开。调用者只需知道想要获取类的名称即可,且扩展性高,如果想增加一个产品,只需再扩展一个工厂类即可。
但每增加一个产品,都需增加一个具体类和对象实现工厂,一定程度上增加了系统复杂性,同时也增加具体类依赖。
创建流程
创建一个接口
package DesignPattern;
public interface Car {
void drive();
}
创建实现接口实体类
package DesignPattern;
public class Sports_Car implements Car {
@Override
public void drive() {
System.out.println("跑车飞驰而过");
}
}
package DesignPattern;
public class Truck implements Car{
@Override
public void drive() {
System.out.println("卡车载物行驶");
}
}
package DesignPattern;
public class Ambulance implements Car{
@Override
public void drive() {
System.out.println("救护车运输病人");
}
}
创建工厂用于生成实体类对象
package DesignPattern;
public class CarFactory {
public Car getCar(String carType){
if (carType == null) {
return null;
}
if(carType.equals("SportsCar")){
return new Sports_Car();
}else if (carType.equals("Truck")){
return new Truck();
}else if (carType.equals("Ambulance")){
return new Ambulance();
}
return null;
}
}
使用工厂,通过传递信息获取实体对象
package DesignPattern;
public class FactoryPatternDemo {
public static void main(String[] args) {
CarFactory factory=new CarFactory();
//获取不同的对象,调用它们的drive()方法
Car car1=factory.getCar("SportsCar");
car1.drive();
Car car2 = factory.getCar("Truck");
car2.drive();
Car car3 = factory.getCar("Ambulance");
car3.drive();
}
}
Output:
跑车飞驰而过
卡车载物行驶
救护车运输病人
抽象工厂模式
抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
创建流程
创建一个接口
package DesignPattern.Factory;
public interface Color {
void fill();
}
创建使用接口实体类
package DesignPattern.Factory;
public class Red implements Color{
@Override
public void fill() {
System.out.println("填充红色");
}
}
package DesignPattern.Factory;
public class Green implements Color{
@Override
public void fill() {
System.out.println("填充绿色");
}
}
package DesignPattern.Factory;
public class Blue implements Color{
@Override
public void fill() {
System.out.println("填充蓝色");
}
}
创建一个接口以及实现实体类
使用上文中的Car接口以及实体类
为接口对象创建抽象类来获取工厂
package DesignPattern.Factory;
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Car getShape(String car);
}
创建扩展了 AbstractFactory 的工厂类
基于给定的信息生成实体类的对象
package DesignPattern.Factory;
public class CarFactory extends AbstractFactory {
public Car getCar(String carType){
if (carType == null) {
return null;
}
if(carType.equals("SportsCar")){
return new Sports_Car();
}else if (carType.equals("Truck")){
return new Truck();
}else if (carType.equals("Ambulance")){
return new Ambulance();
}
return null;
}
public Color getColor(String color){
return null;
}
}
package DesignPattern.Factory;
public class ColorFactory extends AbstractFactory {
@Override
public Car getShape(String carType){
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if(color.equalsIgnoreCase("RED")){
return new Red();
} else if(color.equalsIgnoreCase("GREEN")){
return new Green();
} else if(color.equalsIgnoreCase("BLUE")){
return new Blue();
}
return null;
}
}
创建一个工厂创造器/生成器类
通过传递车辆类型或颜色信息来获取工厂
package DesignPattern.Factory;
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("Car")){
return new CarFactory();
} else if(choice.equalsIgnoreCase("COLOR")){
return new ColorFactory();
}
return null;
}
}
使用 FactoryProducer 来获取 AbstractFactory
通过传递类型信息来获取实体类的对象:
package DesignPattern.Factory;
public class AbstractFactorDemo {
public static void main(String[] args) {
//获取车辆工厂
AbstractFactory carFactory = FactoryProducer.getFactory("Car");
//从工厂里取出一辆车
Car car1=carFactory.getCar("SportsCar");
car1.drive();
Car car2 = carFactory.getCar("Truck");
car2.drive();
Car car3 = carFactory.getCar("Ambulance");
car3.drive();
//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
//获取颜色为 Red 的对象
Color color1 = colorFactory.getColor("RED");
//调用 Red 的 fill 方法
color1.fill();
//获取颜色为 Green 的对象
Color color2 = colorFactory.getColor("GREEN");
//调用 Green 的 fill 方法
color2.fill();
//获取颜色为 Blue 的对象
Color color3 = colorFactory.getColor("BLUE");
//调用 Blue 的 fill 方法
color3.fill();
}
}
Output:
跑车飞驰而过
卡车载物行驶
救护车运输病人
填充红色
填充绿色
填充蓝色