抽象工廠:多個抽象產品類,派生出多個具體產品類;一個抽象工廠類,派生出多個具體工廠類;每一個具體工廠類可建立多個具體產品類的實例。即提供一個建立一系列相關或相互依賴對象的接口,而無需指定他們的具體的類。「一對多」的關係html
package cn.xiaobo.AbstractFactory;
/**
* 抽象的工廠
* @author Administrator
*
*/
public interface AbstractFactory {ide
public ProductA factoryA();
public ProductB factoryB();
}測試
package cn.xiaobo.AbstractFactory;spa
/**
* 抽象的A產品
* @author Administrator
*
*/
public interface ProductA {.net
public void method1();
public void method2();
}設計
package cn.xiaobo.AbstractFactory;
/**
* 抽象的B產品
* @author Administrator
*
*/
public interface ProductB {
public void method1();
public void method2();
}htm
package cn.xiaobo.AbstractFactory;對象
/**
* 具體的等級爲1的A產品
* @author Administrator
*
*/
public class ConcreateProductA1 implements ProductA{blog
@Override
public void method1() {
System.out.println("生產1等級的A產品method1方法");
}
@Override
public void method2() {
System.out.println("生產1等級的A產品method2方法");
}
}接口
package cn.xiaobo.AbstractFactory;
/**
* 具體的等級爲2的A產品
* @author Administrator
*
*/
public class ConcreateProductA2 implements ProductA{
@Override
public void method1() {
System.out.println("生產2等級的A產品method1方法");
}
@Override
public void method2() {
System.out.println("生產2等級的A產品method2方法");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 具體的等級爲1的B產品
* @author Administrator
*
*/
public class ConcreateProductB1 implements ProductB{
@Override
public void method1() {
System.out.println("生產1等級的B產品的method1");
}
@Override
public void method2() {
System.out.println("生產1等級的B產品的method2");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 具體的等級爲2的B產品
* @author Administrator
*
*/
public class ConcreateProductB2 implements ProductB{
@Override
public void method1() {
System.out.println("生產2等級的B產品的method1");
}
@Override
public void method2() {
System.out.println("生產2等級的B產品的method2");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 生產產品等級爲1的具體工廠
* @author Administrator
*
*/
public class ConcreateFactory1 implements AbstractFactory{
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return (ProductA) new ConcreateProductA1();
}
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return (ProductB) new ConcreateProductB1();
}
}
package cn.xiaobo.AbstractFactory;
/**
* 生產產品等級爲2的具體工廠
* @author Administrator
*
*/
public class ConcreateFactory2 implements AbstractFactory{
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return (ProductA) new ConcreateProductA2();
}
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return (ProductB) new ConcreateProductB2();
}
}
package cn.xiaobo.AbstractFactory;
/**
* 抽象工廠模式相對於工廠方法模式來講,每一個具體工廠能夠生產一族產品(即多種產品);而工廠方法模式是具體工廠生產相應的具體產品,只能生產一種產品。
* 當產品族中只有一種產品時抽象工廠模式退化成工廠方法模式。
* @author Administrator
*
*/
public class Customer {
public static void main(String[] args) {
ConcreateFactory1 concreateFactory1=new ConcreateFactory1();
ConcreateFactory2 concreateFactory2=new ConcreateFactory2();
concreateFactory1.factoryA().method1();
concreateFactory1.factoryB().method1();
concreateFactory2.factoryA().method1();
concreateFactory2.factoryB().method1();
}
}
生產1等級的A產品method1方法
生產1等級的B產品的method1
生產2等級的A產品method1方法
生產2等級的B產品的method1
優勢:
一、抽象工廠模式隔離了具體類的生產,使得客戶並不須要知道什麼被建立。
二、當一個產品族中的多個對象被設計成一塊兒工做時,它能保證客戶端始終只使用同一個產品族中的對象。
三、增長新的具體工廠和產品族很方便,無須修改已有系統,符合「開閉原則」。
缺點:
增長新的產品等級結構很複雜,須要修改抽象工廠和全部的具體工廠類,對「開閉原則」的支持呈現傾斜性。