1. 程式人生 > >設計模式 --- 工廠方法模式

設計模式 --- 工廠方法模式

1.定義

一定一個建立物件的介面,讓子類決定例項化哪個類。

 

2.使用場景

在任何需要生成複雜物件的地方,都可以使用工廠方法模式。

 

3.簡單實現

以一個汽車組裝為例,汽車廠主要以組裝一款SUV車型,比如Q3、Q5、Q7,對於這類車型內部差異並不大,除了基本功能以外,還提供了自動巡航,無人駕駛之類的功能。

//產品的抽象類
abstract class Car{

    //汽車行駛的方法
    public abstract void drive();
    //自動巡航的方法
    public abstract void selfNavigation();
}

//Q3車型
class Q3 extends Car{

    @Override
    public void drive() {
        System.out.println("Q3 啟動");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q3 自動巡航");
    }
}

//Q5車型
class Q5 extends Car{

    @Override
    public void drive() {
        System.out.println("Q5 啟動");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5 自動巡航");
    }
}

//Q7車型
class Q7 extends Car{

    @Override
    public void drive() {
        System.out.println("Q7 啟動");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5 自動巡航");
    }
}

//抽象工廠
abstract class CarFactory{
    //T 對應具體型號
    abstract <T extends Car> T createCat(Class<T> clz);
}

//具體的汽車生產線
class MyCarFactory extends CarFactory{

    @Override
    <T extends Car> T createCat(Class<T> clz) {
        Car car = null;
        try {
            car =(Car) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T)car;
    }
}

public class FactoryMode {

    public static void main(String[] arg){
        //建立汽車製造的工廠物件
        MyCarFactory factory  = new MyCarFactory();

        //生產Q3
        Q3 q3 = factory.createCat(Q3.class);
        q3.drive();
        q3.selfNavigation();

        //生產Q5
        Q5 q5 = factory.createCat(Q5.class);
        q5.drive();
        q5.selfNavigation();

        //生產Q7
        Q7 q7 = factory.createCat(Q7.class);
        q7.drive();
        q7.selfNavigation();

    }
}

4.小結

優點:降低了物件的耦合度,而且工廠模式是依賴於抽象的架構,實現交由子類去完成,具有很好的拓展性。

缺點:每次新增一個產品就要新增一個產品類,還要引入抽象層,導致類的結構複雜化。