1. 程式人生 > >工廠模式:工廠方法與抽象工廠的戰爭

工廠模式:工廠方法與抽象工廠的戰爭

概述

什麼是工廠方法?什麼是抽象工廠?

工廠方法是指工廠生產產品,而抽象工廠是生產產品系列。例如,工廠方法是隻生產運輸工具比如馬車、公共汽車、自行車,而抽象工廠生產輪胎、螺絲釘交通工具零件。

工廠方法模式定義了一個建立物件的介面,但由子類決定例項化的類是哪一個。工廠方法讓類把例項化推遲到子類。

抽象工廠模式提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。

簡單工廠

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();
    }
}

總結

工廠方法與抽象工廠各有什麼優缺點?

工廠方法一直都是圍繞著產品這一個緯度,著重考慮怎麼應對產品的變化。例如,新增一種型別的交通工具,並不要修改原始碼就能拓展成功,缺點就是工廠氾濫。

抽象工廠就是針對產品系列可拓展,例如新增某一種系列,人開著飛機去戰鬥,那麼可以交通工具汽車,可以吃榴蓮,手持導彈,可以輕鬆拓展進去。但是,弊端就是,系列工廠最開始要考慮周全,如果中途新增人還要有特定的服裝,那就會非常麻煩。對於產品拓展不足。