抽象工廠模式

一、抽象工廠模式簡介

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱爲其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
目的:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
主要解決:主要解決接口選擇的問題。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的裏面加代碼。產品族難擴展,產品等級易擴展。
二、抽象工廠模式實現

1、創建接口

//創建一個形狀接口
package com.factoryPattern;
public interface Shape {
    public void draw();
}
//爲顏色創建一個接口。
package com.factoryPattern;
public interface Color {
    public void fill();
}

2、創建接口的實現類
以下爲形狀的實現類:

//形狀的實現類
package com.factoryPattern;
/**
 * 創建一個接口實現類Square
 */
public class Square implements Shape{
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("inside in Square:draw a Square");
    }
}
package com.factoryPattern;
/**
 * 創建一個接口的實現類Circle
 */
public class Circle implements Shape{
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("inside Circle:draw a circle");
    }
}
package com.factoryPattern;
/**
 * 創建一個接口的實現類Rectangle
 */
public class Rectangle implements Shape{
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("inside in draw:draw a rectangle");
    }
}

以下爲顏色的實現類:

//顏色的實現類
package com.factoryPattern;
/*
 * 創建實現接口的實體類。
 */
public class Blue implements Color{
    @Override
    public void fill() {
        // TODO Auto-generated method stub
        System.out.println("inside in Bule:fill blue");
    }
}
package com.factoryPattern;
/*
 * 創建實現接口的實體類。
 */
public class Green implements Color{
    @Override
    public void fill() {
        // TODO Auto-generated method stub
        System.out.println("inside in Green:fill green");
    }
}
package com.factoryPattern;
/*
 * 創建實現接口的實體類。
 */
public class Red implements Color{
    @Override
    public void fill() {
        // TODO Auto-generated method stub
        System.out.println("inside in Red:fill red");
    }
}

3、爲 Color 和 Shape 對象創建抽象類來獲取工廠

package com.factoryPattern;
/*
 * 爲 Color 和 Shape 對象創建抽象類來獲取工廠。
 */
public abstract class AbstractFactory {
    abstract Shape getShape(String shapeType);
    abstract Color getColor(String colorType);
}

4、創建擴展了 AbstractFactory 的工廠類,基於給定的信息生成實體類的對象

package com.factoryPattern;
public class ColorAFactory extends AbstractFactory{
    @Override
    Shape getShape(String shapeType) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    Color getColor(String colorType) {
        // TODO Auto-generated method stub
        if(colorType.equalsIgnoreCase("RED")){
            return new Red();
        }else if(colorType.equalsIgnoreCase("BLUE")){
            return new Blue();
        }else if(colorType.equalsIgnoreCase("GREEN")){
            return new Green();
        }
        return null;
    }
}

package com.factoryPattern;
public class ShapeAFactory extends AbstractFactory{
    @Override
    Shape getShape(String shapeType) {
        // TODO Auto-generated method stub
        if(shapeType==null || "".equals(shapeType)){
            return null;
        }else if(shapeType.equalsIgnoreCase("CIRCLE")){
            return new Circle();
        }else if(shapeType.equalsIgnoreCase("SQUARE")){
            return new Square();
        }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
            return new Rectangle();
        }
        return null;
    }
    @Override
    Color getColor(String colorType) {
        // TODO Auto-generated method stub
        return null;
    }
}

5、創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠

package com.factoryPattern;
/*
 * 創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠。
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice){
        if("share".equals(choice)){
            return new ShapeAFactory();
        }else if("color".equals(choice)){
            return new ColorAFactory();
        }
        return null;
    }

}

7、使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象。

//使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象。
package com.factoryPattern;
public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        //獲取形狀工廠
          AbstractFactory shapeFactory = FactoryProducer.getFactory("share");
          //獲取形狀爲 Circle 的對象
          Shape shape1 = shapeFactory.getShape("CIRCLE");
          //調用 Circle 的 draw 方法
          shape1.draw();
          //獲取形狀爲 Rectangle 的對象
          Shape shape2 = shapeFactory.getShape("RECTANGLE");
          //調用 Rectangle 的 draw 方法
          shape2.draw();
          //獲取形狀爲 Square 的對象
          Shape shape3 = shapeFactory.getShape("SQUARE");
          //調用 Square 的 draw 方法
          shape3.draw();
          //獲取顏色工廠
          AbstractFactory colorFactory = FactoryProducer.getFactory("color");
          //獲取顏色爲 Red 的對象
          Color color1 = colorFactory.getColor("RED");
          //調用 Red 的 fill 方法
          color1.fill();
          //獲取顏色爲 Green 的對象
          Color color2 = colorFactory.getColor("Green");
          //調用 Green 的 fill 方法
          color2.fill();
          //獲取顏色爲 Blue 的對象
          Color color3 = colorFactory.getColor("BLUE");
          //調用 Blue 的 fill 方法
          color3.fill();
       }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章