工厂模式

在面向对象编程中,继承是一个基本概念,它与多态共同构成了类的父子继承关系。Car对象可以被当作Vehicle对象处理,Truck对象也可以被当作Vehicle对象处理。一方面,这种抽象方式使得同一段代码能为Car和Truck对象提供同样的处理操作,使代码更加简洁;另一方面,如果要扩展新的Vehicle对象类型,比如Bike,不再需要修改代码,只需添加新的类即可。

类应该保持对扩展的开放和对修改的关闭(开闭原则);
每个类应该只有一个发生变化的原因(单一职责原则)。

工厂模式用于实现逻辑的封装,并通过公共的接口提供对象的实例化服务,在添加新的类时只需要做少量的修改。

1.静态工厂模式

public class VehicleFactory {
    public enum VehicleType {
        Bike, Car, Truck;
    }
    public static Vehicle create(VehicleType type) {
        if (type.equals(VehicleType.Bike))
            return new Bike();
        if (type.equals(VehicleType.Car))
            return new Car();
        if (type.equals(VehicleType.Truck))
            return new Truck();
    }
}

增加一个新的Vehicle类时,需要对VehicleFactory类进行修改,这样就打破了开闭原则。

2.改进上述的简单工厂模式,使用newInstance方法进行类注册的简单工厂模式

public class VehicleFactory {
    private Map<String, Vehicle> registeredProducts = new HashMap<>();

    public void registerVehicle(String vehicleId, Vehicle vehicle) {
        registeredProducts.put(vehicleId, vehicle);
    }

    public Vehicle createVehicle(String vehicleId) {
        return registeredProducts.get(vehicleId).newInstance();
    }
}
abstract public class Vehicle {
    abstract public Vehicle newInstance();

    public void dosomething() {
        System.out.println("Vehicle");
    }
}
public class Car extends Vehicle {
    @Override
    public Car newInstance() {
        return new Car();
    }

    @Override
    public void dosomething() {
        System.out.println("Car");
    }
}

public class Truck extends Vehicle{
    @Override
    public Truck newInstance() {
        return new Truck();
    }

    @Override
    public void dosomething() {
        System.out.println("Truck");
    }
}
public class test {
    public static void main(String[] args) {
        VehicleFactory vehicleFactory = new VehicleFactory();
        vehicleFactory.registerVehicle("Car", new Car());
        vehicleFactory.registerVehicle("Truck", new Truck());

        Vehicle vehicle = vehicleFactory.createVehicle("Car");
        vehicle.dosomething();
        Vehicle vehicle1 = vehicleFactory.createVehicle("Truck");
        vehicle1.dosomething();
    }
}

3.工厂方法模式
工厂方法模式是在静态工厂模式上的改进。工厂类被抽象化,用于实例化特定产品类的代码被转移到实现抽象方法的子类中。

abstract public class Vehicle {
    public void dosomthing() {
        System.out.println("vehicle");
    }
}

public class Car extends Vehicle {
    @Override
    public void dosomthing() {
        System.out.println("car");
    }
}

public class Truck extends Vehicle{
    @Override
    public void dosomthing() {
        System.out.println("truck");
    }
}
abstract public class VehicleFactory {
    public abstract Vehicle createVehicle(String item);

    public Vehicle orderVehicle(String type) {
        Vehicle vehicle = createVehicle(type);
        return vehicle;
    }
}

public class Factory extends VehicleFactory {
    @Override
    public Vehicle createVehicle(String item) {
        if (item.equals("Car"))
            return new Car();
        if (item.equals("Truck"))
            return new Truck();
        return null;
    }
}
public class test {
    public static void main(String[] args) {
        VehicleFactory factory = new Factory();
        factory.orderVehicle("Car").dosomthing();
        factory.orderVehicle("Truck").dosomthing();
    }
}

注意:工厂类中并不包含任何创建新实例的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值