設計模式-工廠模式

工廠模式定義 Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類)

  • 類圖比較簡單,AbstractCarFactory是一個抽象類,CarFactory為實現類,完成具體的任務——創建車;Car接口是車類的總稱,其三個實現類分別為三類車;Client類是一個場景類,負責模擬這個造車場景,執行相關的任務。
image.png
看一個簡單的例子
//接口
public interface Car {

    //每個車都有顏色
    public void getColor();

    //每個車都有輪胎顏色
    public void getTire();
}

//實現類
public class AudiBlackCar implements Car {
    @Override
    public void getColor() {
        System.out.println("黑色奧迪車");
    }

    @Override
    public void getTire() {
        System.out.println("黑色輪胎");
    }
}
//實現類
public class AudiRedCar implements Car {
    @Override
    public void getColor() {
        System.out.println("紅色奧迪車");
    }

    @Override
    public void getTire() {
        System.out.println("紅色輪胎");
    }
}

//實現類
public class AudiWhiteCar implements Car {
    @Override
    public void getColor() {
        System.out.println("白色奧迪車");
    }

    @Override
    public void getTire() {
        System.out.println("白色輪胎");
    }
}
//抽象工廠類
public abstract class AbstractCarFactory {
    public abstract <T extends Car> T createCar(Class<T> c);
}

//實現類
public class CarFactory extends AbstractCarFactory {
    @Override
    public <T extends Car> T createCar(Class<T> c) {
        //定義一個車
        Car car = null;
        try {
            car = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            System.out.println("車生產錯誤");
        }
        return (T)car;
    }
}
//客戶端
public class Client {

    public static void main(String[] args) {
        AbstractCarFactory carFactory = new CarFactory();
        AudiBlackCar audiBlackCar = carFactory.createCar(AudiBlackCar.class);
        audiBlackCar.getColor();
        audiBlackCar.getTire();
        System.out.println("+++++++++++++++++++++");
        AudiWhiteCar audiWhiteCar = carFactory.createCar(AudiWhiteCar.class);
        audiWhiteCar.getColor();
        audiWhiteCar.getTire();
        System.out.println("+++++++++++++++++++++");
        AudiRedCar audiRedCar = carFactory.createCar(AudiRedCar.class);
        audiRedCar.getColor();
        audiRedCar.getTire();
    }
}

以上就是一個簡單的工廠模式,造不同顏色的車,比較清晰明了

  • 工廠模式的優點

1.良好的封裝性,代碼結構清晰。創建對象簡單只需要知道對象的類名就可以
2.比較容易擴展,增加產品的時候,只需要需改具體工廠類或者新增一個工廠類就可以。
3.屏蔽產品類。產品如何變化,調用者不需要關心,只需要關心接口。
4.工廠類典型解耦框架。高層模塊只需要知道產品的抽象類,其他不用關心。

  • 工廠模式使用場景

1.需要靈活,可擴展框架時候可以考慮工廠模式
2.說白了工廠類就是new一個對象的替代品。

  • 工廠模式擴展

1. 把上面例工廠類可以擴展為靜態方法

public class EnhangeCarFactory {
    public static   <T extends Car> T createCar(Class<T> c) {
        //定義一個車
        Car car = null;
        try {
            car = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            System.out.println("車生產錯誤");
        }
        return (T)car;
    }
}

2. 把上面例子升級多個工廠:目的是把所有產品放到一個工廠方法里面有可能結構不清晰。現在把生產每種顏色的車工廠都定義一個創造者,讓調用者自己去選擇與那個工廠關聯。

主要代碼如下

//抽象類
public abstract class AbstractEnCarFactory {
    public abstract Car createCar();
}
//實現類
public class AudiBlackCarFactory extends AbstractEnCarFactory {

    @Override
    public Car createCar() {
        return new AudiBlackCar();
    }
}
//實現類
public class AudiRedCarFactory extends AbstractEnCarFactory {
    @Override
    public Car createCar() {
        return new AudiRedCar();
    }
}

//實現類
public class AudiWhiteCarFactory extends AbstractEnCarFactory {
    @Override
    public Car createCar() {
        return new AudiWhiteCar();
    }
}
public class Client {

    public static void main(String[] args) {
        Car audiBlackCar = new AudiBlackCarFactory().createCar();
        audiBlackCar.getColor();
        audiBlackCar.getTire();
        Car audiRedCar = new AudiRedCarFactory().createCar();
        audiRedCar.getColor();
        audiRedCar.getTire();
        Car audiWhiteCar = new AudiWhiteCarFactory().createCar();
        audiWhiteCar.getColor();
        audiWhiteCar.getTire();
    }
}

image.png

以上就是工廠模式的基本簡單用法,歡迎大家查看并指出不足的地方,萬分感謝

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容