天天看點

java設計模式第三發:抽象工廠模式

抽象工廠模式的主要優點包括:

使得用戶端代碼與具體産品的實作分離,用戶端不需要知道具體産品的類名,隻需要知道它們所對應的工廠即可,降低了用戶端與具體産品的耦合度。

更容易實作一組産品族的建立,隻需要在抽象工廠中添加一個新的接口方法即可,同時也符合開閉原則。

符合單一職責原則,每個具體工廠隻負責建立一組具體産品,不會與其他産品産生耦合。

總的來說,抽象工廠模式能夠提供更高層次的抽象,同時也能夠更好地管理不同産品族之間的關系,進而使得系統更加靈活和易于擴充。

以下是使用Java語言實作抽象工廠模式的示例代碼:

首先,定義産品接口:

public interface Product {
void showInfo();
}
           
然後,定義兩種具體的産品類:           
public class ConcreteProductA implements Product {
	@Override
	public void showInfo() {
	System.out.println("This is Concrete Product A.");
	}
}

public class ConcreteProductB implements Product {
	@Override
	public void showInfo() {
	System.out.println("This is Concrete Product B.");
	}
}
           
接着,定義抽象工廠接口:           
public interface AbstractFactory {
	Product createProductA();
	Product createProductB();
}
           
然後,定義兩種具體的工廠類:           
public class ConcreteFactory1 implements AbstractFactory {
	@Override
	public Product createProductA() {
	return new ConcreteProductA();
	}
	@Override
	public Product createProductB() {
	return new ConcreteProductB();
	}
}
public class ConcreteFactory2 implements AbstractFactory {
	@Override
	public Product createProductA() {
	return new ConcreteProductB();
	}
	@Override
	public Product createProductB() {
	return new ConcreteProductA();
	}
}
           
最後,編寫測試代碼:           
public class AbstractFactoryDemo {
  public static void main(String[] args) {
    AbstractFactory factory1 = new ConcreteFactory1();
    Product productA1 = factory1.createProductA();
    productA1.showInfo();
    Product productB1 = factory1.createProductB();
    productB1.showInfo();
    AbstractFactory factory2 = new ConcreteFactory2();
    Product productA2 = factory2.createProductA();
    productA2.showInfo();
    Product productB2 = factory2.createProductB();
    productB2.showInfo();
 }
}
           

在這個示例中,我們定義了兩個具體的産品類ConcreteProductA和ConcreteProductB,它們都實作了Product接口,并分别實作了showInfo方法。然後,我們定義了抽象工廠接口AbstractFactory,它包含了兩個方法createProductA和createProductB。接下來,我們定義了兩個具體的工廠類ConcreteFactory1和ConcreteFactory2,它們都實作了AbstractFactory接口,并分别實作了createProductA和createProductB方法,傳回不同的具體産品對象。最後,我們編寫了測試代碼,使用不同的工廠對象分别建立不同的産品對象,并調用它們的showInfo方法輸出資訊。

通過使用抽象工廠模式,我們可以将産品對象的建立過程與用戶端代碼分離開來,使得用戶端隻需要知道具體的工廠類和抽象産品類,而不需要關心具體的産品類。這種解耦合的方式可以更加靈活地設計和擴充系統。