1. 程式人生 > 其它 >迅為RK3399開發板嵌入式linux開發指南

迅為RK3399開發板嵌入式linux開發指南

工廠模式

概述

在父類中提供一個建立物件的方法,允許子類決定例項化物件的型別。

使用場景

假設一家汽車製造公司,一直在使用一套程式生產比亞迪型號的汽車,現在出現了大批量的特斯拉汽車的訂單,如果在原來的程式上進行修改的話就會違反開閉原則,同時如果後期又多了其他品牌的訂單,則再原程式上修改顯得不現實。

解決方法

該公司分開出來兩個製造工廠,BYDFactory和TeslaFactory,去分別製造該型別的汽車。公司接到訂單後,只需要派給不同的公司即可。

實現

// 抽象工廠類介面
public interface CarFactory {
    public Car produce();
}

// 抽象產品類介面
// public interface Car {
    String show();
}

// 特斯拉工廠
public class TeslaFactory implements CarFactory{
    @Override
    public Car produce() {
    		// 只生產特斯拉
        return new TeslaCar();
    }
}

// 比亞迪工廠
public class BYDFactory implements CarFactory{
    @Override
    public Car produce() {
    		// 只生產比亞迪
        return new BYDCar();
    }
}

// 比亞迪汽車
public class BYDCar implements Car{
    @Override
    public String show() {
        return "Build Your Dream";
    }
}

// 特斯拉汽車
public class TeslaCar implements Car{
    @Override
    public String show() {
        return "Go Electric";
    }
}

// 製造汽車
public class Client {
    public static void main(String[] args) {
        // 不關心建立過程,只關心呼叫者是誰
        Car car = new BYDFactory().produce();
        String show = car.show();
        System.out.println(show);
    }
}

總結

  1. 需要有抽象工廠類和抽象產品類,工廠類生產各自的產品。
  2. 遵循開閉原則,不會對原程式進行修改。
  3. 單一功能指責,每個工廠的職責互不影響,比如特斯拉制造的四驅系統,比亞迪製造後驅系統。
  4. 缺點就是可能隨著品牌增多,導致具體工廠類和具體產品類數量變多。

抽象工廠模式

概述

能建立一系列相關物件,而不需要制定具體類。

使用場景

電腦組裝廠要組裝聯想和戴爾品牌的電腦,兩種品牌的電腦採用的CPU、記憶體、硬碟都是不一樣的廠家,如果不區分使用一套程式去製造非常困難,而且後期CPU換了型號,還要對應用程式大動手腳。

解決方法

應當採用抽象工廠模式,抽象出一條整鏈的原材料,如果後期修改的話對於上一層呼叫的地方不用修改,只需要修改具體工廠的方法。比如聯想將CPU換為AMD只需要修改聯想廠家的方法。

實現

// 抽象工廠
public interface ComputerFactory {
    CPU createCpu();

    Memory createMemory();
}

// 抽象產品
public interface CPU {
    void work();
}

public interface Memory {
    default void work() {
        System.out.println("預設記憶體");
    }
}

// 具體產品
public class IntelCpu implements CPU{
    @Override
    public void work() {
        System.out.println("intel CPU");
    }
}

public class AppleCpu implements CPU{
    @Override
    public void work() {
        System.out.println("apple cpu");
    }
}

// 具體工廠
public class DellFactory implements ComputerFactory {
		// apple cpu
    @Override
    public CPU createCpu() {
        return new AppleCpu();
    }

    @Override
    public Memory createMemory() {
        return new Memory() {
        };
    }
}


public class LenovoFactory implements ComputerFactory {
		// intel cpu
    @Override
    public CPU createCpu() {
        return new IntelCpu();
    }

    @Override
    public Memory createMemory() {
        return new Memory() {
        };
    }
}


public class Client {
    public static void main(String[] args) {
    		// 抽象工廠可以生產不同具體類一系列產品
        DellFactory factory = new DellFactory();
        factory.createCpu().work();
        factory.createMemory().work();
    }
}

總結

  1. 與普通工廠模式的區別就是每一個工廠不是建立單個物件,而是建立多個物件。