设计模式学习(工厂模式&抽象工厂模式)

目录

工厂模式

创建流程

创建一个接口

创建实现接口实体类

创建工厂用于生成实体类对象

使用工厂,通过传递信息获取实体对象

抽象工厂模式

创建流程

创建一个接口

创建使用接口实体类

创建一个接口以及实现实体类

为接口对象创建抽象类来获取工厂

创建扩展了 AbstractFactory 的工厂类

创建一个工厂创造器/生成器类

使用 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:

跑车飞驰而过
卡车载物行驶
救护车运输病人
填充红色
填充绿色
填充蓝色

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值