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

概述

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

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

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

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

简单工厂

 交通工具创建者类

public interface VehicleFactory {
    Vehicle create();
}

public class BicycleFactory implements VehicleFactory {

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bicycle();
}

}

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

public class BusFactory implements VehicleFactory{

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> 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
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
    System.out.println(</span>"马车   撇撇撇"<span style="color: #000000;">);

}

}

客户端

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
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Carriage();
}

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
}

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> SteamedBun();
}

}

class BusFactory implements AbstractFactory{

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bus();
}

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
}

@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> 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</span>=<span style="color: #000000;">factory.createFood();
    Vehicle v</span>=<span style="color: #000000;">factory.createVehicle();
    Weapon w</span>=<span style="color: #000000;">factory.createWeapon();
    
    f.eat();
    v.run();
    w.shot();
}

}

总结

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

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

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

???

原文地址:https://www.cnblogs.com/qiuyong/p/6918925.html