java設計模式--抽象工廠模式

抽象工廠模式:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。ide

咱們先回憶一下簡單工廠模式的情形,有一個建立產品的接口,須要建立不一樣的產品時咱們就須要建立多個工廠類。spa

//工廠接口
public interface IFactory {
   //建立產品
    Product createProduct();
}

//具體工廠
public class CarFactory implements IFactory {
    @Override
    public Product createProduct() {
     //建立產品實例對象
        return new Car();
    }
}

public class BicycleFactory implements IFactory {
    @Override
    public Product createProduct() {
        return new Bicycle();
    }
}
public class Customer {
    public static void main(String[] args) {
        IFactory carFactory = new CarFactory();
        Product car = carFactory.createProduct();
        car.run();

        IFactory bicycleFactory = new BicycleFactory();
        Product bicycle = bicycleFactory.createProduct();
        bicycle.run();
    }
}

可是若是是這麼一種情形呢,咱們要生產的產品是一個類別,而且再也不是一個,而是多個時,這種product接口就不符合狀況了code

咱們看一個例子,假設須要不一樣的方法建立一系列產品對象

產品接口A以及實現。blog

public interface  ProductA {
    void Show();
}

public class ProductA1 implements ProductA {
    @Override
    public void Show() {
        System.out.println("使用工廠1生產出了產品A");
    }
}

public class ProductA2 implements ProductA {
    @Override
    public void Show() {
        System.out.println("使用工廠2生產出了產品A");
    }
}

 

  產品接口B以及實現。接口

public interface ProductB {
    void Show();
}

public class ProductB1 implements ProductB {
    @Override
    public void Show() {
        System.out.println("使用工廠1生產出了產品B");
    }
}

public class ProductB2 implements ProductB {
    @Override
    public void Show() {
        System.out.println("使用工廠2生產出了產品B");
    }
}

 

  工廠接口以及實現,兩個具體工廠分別對應兩種生產該產品的方法。產品

public interface Factory {
    ProductA ManufactureA();

    ProductB ManufactureB();
}

public class ConcreateFactory1 implements Factory {
    @Override
    public ProductA ManufactureA() {
        return new ProductA1();
    }

    @Override
    public ProductB ManufactureB() {
        return new ProductB1();
    }
}

public class ConcreateFactory2 implements Factory {
    @Override
    public ProductA ManufactureA() {
        return new ProductA2();
    }

    @Override
    public ProductB ManufactureB() {
        return new ProductB2();
    }
}

  在實際應用中,咱們可能只須要某一種方法去建立產品A,B,可是當咱們想要切換產品的生產方法時,就只須要將new ConcreateFactory1()替換爲new ConcreateFactory2()就能夠了,此時不管是哪個工廠的方法,他生產某一個產品調用的都是同一個方法,例如factory.ManufactureA();可是若是在工廠方法模式中,咱們新增一個產品的製做方法,就須要新增工廠,在客戶端內去調用不一樣工廠的createProduct()這樣就增長了系統的複雜性。class

public class Test {
    public static void main(String[] args){
        Factory factory = new ConcreateFactory1();
        ProductA productA = factory.ManufactureA();
        ProductB productB = factory.ManufactureB();
        productA.Show();
        productB.Show();

        Factory factory2 = new ConcreateFactory2();
        ProductA productA2 = factory2.ManufactureA();
        ProductB productB2 = factory2.ManufactureB();
        productA2.Show();
        productB2.Show();
    }
}
相關文章
相關標籤/搜索