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

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

變化 com imp println 源碼 客戶端 font print apple

概述

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

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

工廠方法模式定義了一個創建對象的接口,但由子類決定實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。

抽象工廠模式提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。

簡單工廠

技術分享

交通工具創建者類

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

總結

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

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

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

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