1. 程式人生 > 實用技巧 >23種設計模式——工廠模式

23種設計模式——工廠模式

23種設計模式——工廠模式

作用

實現了建立者和呼叫者分離

詳細分類

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

核心本質

  • 例項化物件不使用new,用工廠方法代替

  • 將選擇實現類,建立物件統一管理和控制。從而將呼叫者跟我們的實現類解耦

1)簡單工廠(靜態工廠模式)

雖然某種程度上不符合設計原則,但實際用的最多

package com.mjh.factory.simple;

public interface Car {
    void name();
}
package com.mjh.factory.simple;

public class AoDi implements Car {
    @Override
    public void name() {
        System.out.println("奧迪");
    }
}
package com.mjh.factory.simple;

public class TesLa implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
package com.mjh.factory.simple;

//靜態工廠模式
//增加一個新產品,如果你不修改程式碼,做不到的

//開閉原則
public class CarFactory {
    public static Car getCar(String car){

        //方法一
        if(car.equals("奧迪")){
            return new AoDi();
        }else  if(car.equals("特斯拉")){
            return new TesLa();
        }else {
            return null;
        }
    }

    //方法二
    public  static Car getAoDi(){
        return new AoDi();
    }
    public  static Car getTesLa(){
        return new TesLa();
    }

}
package com.mjh.factory.simple;

public class Impl {
    public static void main(String[] args) {
       /* Car car = new AoDi();
        Car car1 = new TesLa();  不用new建立了,只需建立一個工廠*/

       //使用工廠建立
        Car car = CarFactory.getCar("奧迪");
        Car car1= CarFactory.getCar("特斯拉");
        car.name();
        car1.name();

    }
}

2)工廠方法模式

不修改已有的類的前提下,通過增加新的工廠實現擴充套件

package com.mjh.factory.method;

public interface Car {
    void name();
}
package com.mjh.factory.method;

public interface CarFactory {
    Car getCar();
}
package com.mjh.factory.method;

public class AoDi implements Car {
    @Override
    public void name() {
        System.out.println("奧迪");
    }
}
package com.mjh.factory.method;

public class AoDiFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new AoDi();
    }
}
package com.mjh.factory.method;

public class Impl {
    public static void main(String[] args) {
        Car car = new AoDiFactory().getCar();
        Car car1 = new TesLaFactory().getCar();
        car.name();
        car1.name();
    }
}

兩種方式的對比

結構複雜度:簡單工廠方法

程式碼複雜度:簡單工廠方法

程式設計複雜度:簡單工廠方法

管理上的複雜度:簡單工廠方法

根據設計原則:工廠方法模式

根據實際業務:簡單工廠模式