AbstractFactory--抽象工廠模式java實現

1.原理

    1.1

 抽象工廠:多個抽象產品類,派生出多個具體產品類;一個抽象工廠類,派生出多個具體工廠類;每一個具體工廠類可建立多個具體產品類的實例。即提供一個建立一系列相關或相互依賴對象的接口,而無需指定他們的具體的類。「一對多」的關係html

    1.2 UML圖

    

2.AbstractFactory 接口,要生產各類產品的工廠在這裏

package cn.xiaobo.AbstractFactory;
/**
 * 抽象的工廠
 * @author Administrator
 *
 */
public interface AbstractFactory {
ide

    public ProductA factoryA();
    public ProductB factoryB();
}
測試

3.抽象的A產品,包含了兩個方法,方法視具體的業務而定

package cn.xiaobo.AbstractFactory;spa

/**
 * 抽象的A產品
 * @author Administrator
 *
 */
public interface ProductA {
.net

    public void method1();
    public void method2();
}
設計

4.抽象的B產品,包含了兩個方法,方法視具體的業務而定

package cn.xiaobo.AbstractFactory;
/**
 * 抽象的B產品
 * @author Administrator
 *
 */
public interface ProductB {
    public void method1();
    public void method2();
}
htm

5.實現A產品接口的具體的等級爲1的A產品

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方法");
        
    }
}
接口

6.實現A產品接口的具體的等級爲2的A產品

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方法");
        
    }
}

7.實現B產品接口的具體的等級爲1的B產品

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");
        
    }
}

8.實現B產品接口的具體的等級爲2的B產品

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");
        
    }
}

9.實現抽象工廠接口的生產等級爲1產品的工廠1

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();
    }
}

10 實現抽象工廠接口的生產等級爲2產品的工廠2

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();
    }
}

11.進行測試

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();
    }
}

12.結果

 生產1等級的A產品method1方法
生產1等級的B產品的method1
生產2等級的A產品method1方法
生產2等級的B產品的method1

13.優點與缺點

優勢:

一、抽象工廠模式隔離了具體類的生產,使得客戶並不須要知道什麼被建立。

二、當一個產品族中的多個對象被設計成一塊兒工做時,它能保證客戶端始終只使用同一個產品族中的對象。

三、增長新的具體工廠和產品族很方便,無須修改已有系統,符合「開閉原則」。

缺點:

增長新的產品等級結構很複雜,須要修改抽象工廠和全部的具體工廠類,對「開閉原則」的支持呈現傾斜性。

14.參考博客

https://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html

相關文章
相關標籤/搜索