工厂模式:工厂方法与抽象工厂的战争

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18975791/article/details/83176658

概述

什么是工厂方法?什么是抽象工厂?

工厂方法是指工厂生产产品,而抽象工厂是生产产品系列。例如,工厂方法是只生产运输工具比如马车、公共汽车、自行车,而抽象工厂生产轮胎、螺丝钉交通工具零件。

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

简单工厂

public interface VehicleFactory {
    Vehicle create();
}

public class BicycleFactory implements VehicleFactory {

    @Override
    public Vehicle create() {
        return new Bicycle();
    }

}

public class CarriageFactory implements VehicleFactory{
    public Vehicle create() {
        return new Carriage();
    }
}

public class BusFactory implements VehicleFactory{

    @Override
    public Vehicle create() {
        return new Bus();
    }

}

 产品类

public interface Vehicle {
    void run();
}

public class Bicycle implements Vehicle {
    @Override
    public void run() {
        System.out.println("自行車 蹬蹬蹬");
    }
}

public class Bus implements Vehicle{
    @Override
    public void run() {
        System.out.println("bus 咚咚咚");
        
    }
}

public class Carriage implements Vehicle {

    @Override
    public void run() {
        System.out.println("马车   撇撇撇");

    }

}

客户端

public class Client {
    public static void main(String[] args) {
        VehicleFactory factory=new CarriageFactory();
        Vehicle vehicle=factory.create();
        vehicle.run();
    }
}

抽象工厂

public interface AbstractFactory {
    //骑的坐骑
    Vehicle createVehicle();
    //拿的武器
    Weapon createWeapon();
    //补充的粮食
    Food createFood();
}

class CarriageFacetory implements AbstractFactory{

    @Override
    public Vehicle createVehicle() {
        return new Carriage();
    }

    @Override
    public Weapon createWeapon() {
        return new AK47();
    }

    @Override
    public Food createFood() {
        return new SteamedBun();
    }

}

class BusFactory implements AbstractFactory{

    @Override
    public Vehicle createVehicle() {
        return new Bus();
    }

    @Override
    public Weapon createWeapon() {
        return new AK47();
    }

    @Override
    public Food createFood() {
        return new Apple();
    }

}

骑的交通工具

public interface Vehicle {
    void run();
}

class Bus implements Vehicle{
    @Override
    public void run() {
        System.out.println("bus 咚咚咚");
        
    }
}

public class Carriage implements Vehicle {
    @Override
    public void run() {
        System.out.println("马车   撇撇撇");

    }
}

拿的武器

public interface Weapon {
    void shot();
}

class AK47 implements Weapon{
    @Override
    public void shot() {
        System.out.println("开Bus的手持ak47");
        
    }
}

class Stick implements Weapon{
    public void shot() {
        System.out.println("骑马的拿着铁棍!");
    }
}

吃的粮食

public interface Food {
    void eat();
}

class Apple implements Food {
    @Override
    public void eat() {
        System.out.println("开bus的吃苹果");
    }
}

class SteamedBun implements Food{
    @Override
    public void eat() {
        System.out.println("骑马的吃馒头");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory=new BusFactory();
        
        Food f=factory.createFood();
        Vehicle v=factory.createVehicle();
        Weapon w=factory.createWeapon();
        
        f.eat();
        v.run();
        w.shot();
    }
}

总结

工厂方法与抽象工厂各有什么优缺点?

工厂方法一直都是围绕着产品这一个纬度,着重考虑怎么应对产品的变化。例如,新增一种类型的交通工具,并不要修改源码就能拓展成功,缺点就是工厂泛滥。

抽象工厂就是针对产品系列可拓展,例如新增某一种系列,人开着飞机去战斗,那么可以交通工具汽车,可以吃榴莲,手持导弹,可以轻松拓展进去。但是,弊端就是,系列工厂最开始要考虑周全,如果中途新增人还要有特定的服装,那就会非常麻烦。对于产品拓展不足。

猜你喜欢

转载自blog.csdn.net/qq_18975791/article/details/83176658