簡單工廠模式、工廠模式和抽象工廠模式
1. 簡單工廠模式
簡單工廠模式屬于建立型模式,是工廠模式的一種。簡單工廠模式定義了一個建立對象的類,由這個類來封裝執行個體化對象的行為。它是由一個工廠對象決定建立出哪一種産品類的執行個體。
簡單工廠模式是工廠模式中最簡單使用的模式。
簡單工廠模式的三個角色
- Factory(工廠角色) :簡單工廠模式的核心,它負責實作建立所有執行個體的内部邏輯,根據調用時傳入的參數,進而建立不同的對象。
- Product(抽象産品角色) :簡單工廠模式中所建立所有對象的父類,負責描述是以産品的執行個體行為。
- Concrete Product(具體産品角色):簡單工廠模式的建立目标,所有從工廠中建立的對象都是充當這個角色的某個具體類的執行個體。
舉一個栗子
建立一個可以繪制不同圖形的工具,可以繪制圓形、矩形等。
Shape:抽象産品形狀
package cn.personalweb.factory.simplefactory;
public abstract class Shape {
/**
* 畫圖形的方法
*/
abstract void draw();
}
Circle:具體産品圓形
實作了
Shape
中的畫方法。
package cn.personalweb.factory.simplefactory;
public class Circle extends Shape{
@Override
void draw() {
System.out.println("draw Circle");
}
}
Rectangle:具體産品矩形
實作了
Shape
中的畫方法。
package cn.personalweb.factory.simplefactory;
public class Rectangle extends Shape {
@Override
void draw() {
System.out.println("draw Rectangle");
}
}
SimpleFactory:簡單工廠
内部定義了一個建立産品的方法
getShape
,此方法根據傳入的參數來建立不同的産品。
package cn.personalweb.factory.simplefactory;
public class SimpleFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equals("Circle")) {
return new Circle();
} else if (shapeType.equals("Rectangle")) {
return new Rectangle();
}
return null;
}
}
Client:用戶端
package cn.personalweb.factory.simplefactory;
public class Client {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Shape rectangle = simpleFactory.getShape("Rectangle");
rectangle.draw();
Shape circle = simpleFactory.getShape("Circle");
circle.draw();
}
}
輸出結果
draw Rectangle
draw Circle
2. 工廠方法模式
工廠方法模式是簡單工廠的僅一步深化, 在工廠方法模式中,我們不再提供一個統一的工廠類來建立所有的對象,而是針對不同的對象提供不同的工廠。也就是說 每個對象都有一個與之對應的工廠 。
工廠模式定義了一個建立對象的抽象方法,由子工廠類決定要執行個體化的類。工廠方法模式将對象的執行個體化推遲到子工廠類。
工廠方法模式的四個角色
- Abstract Factory(抽象工廠角色):是工廠方法模式的核心,與應用程式無關。任何在模式中建立的對象的工廠類必須實作這個接口。
- Concrete Factory(具體工廠角色) :這是實作抽象工廠接口的具體工廠類,包含與應用程式密切相關的邏輯,并且受到應用程式調用以建立某一種産品對象。
- AbstractProduct(抽象産品角色) :工廠方法模式所建立的對象的超類型,也就是産品對象的共同父類或共同擁有的接口。
- Concrete Product(具體産品角色) :這個角色實作了抽象産品角色所定義的接口。某具體産品有專門的具體工廠建立,它們之間往往一一對應
舉一個栗子
同上建立一個可以繪制不同圖形的工具,可以繪制圓形、矩形等。
Shape:抽象産品形狀
package cn.personalweb.factory.factory;
public abstract class Shape {
/**
* 畫圖形的方法
*/
abstract void draw();
}
Circle:具體産品圓形
package cn.personalweb.factory.factory;
public class Circle extends Shape {
@Override
void draw() {
System.out.println("draw Circle");
}
}
Rectangle:具體産品矩形
package cn.personalweb.factory.factory;
public class Rectangle extends Shape {
@Override
void draw() {
System.out.println("draw Rectangle");
}
}
Factory:抽象工廠
package cn.personalweb.factory.factory;
public interface Factory {
public Shape getShape();
}
CircleFactory:具體圓形工廠
package cn.personalweb.factory.factory;
public class CircleFactory implements Factory{
@Override
public Shape getShape() {
return new Circle();
}
}
RectangleFactory:具體矩形工廠
package cn.personalweb.factory.factory;
public class RectangleFactory implements Factory{
@Override
public Shape getShape() {
return new Rectangle();
}
}
Client:用戶端
package cn.personalweb.factory.factory;
public class Client {
public static void main(String[] args) {
CircleFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.getShape();
circle.draw();
RectangleFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.getShape();
rectangle.draw();
}
}
輸出結果
draw Circle
draw Rectangle
3. 抽象工廠
在前面的工廠模式中我們生産的都是同一類産品,而抽象工廠模式是工廠方法的僅一步深化,在這個模式中的工廠類不單單可以建立一種産品,而是可以建立一組産品。
基本介紹
- 抽象工廠模式:定義了一個**
用于建立相關或有依賴關系的對象簇**,而無需指明具體的類interface
- 抽象工廠模式可以将簡單工廠模式和工廠方法模式進行整合
- 從設計層面上看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步抽象)
- 将工廠抽象成兩層,ABSFactor(抽象工廠)和具體實作的子類。程式員可以根據建立對象類型使用對應的工程子類。這樣将單個的簡單工廠類程式設計了工廠簇,更利于代碼的維護和擴充
在抽象工廠模式中,有一個産品族的概念:所謂的産品族,是指位于不同産品等級結構中功能相關聯的産品組成的家族。抽象工廠模式所提供的一系列産品就組成一個産品族;而工廠方法提供的一系列産品稱為一個等級結構。
抽象工廠的工廠和工廠方法中的工廠有什麼差別呢?
抽象工廠是生産一整套有産品的(至少要生産兩個産品),這些産品必須互相是有關系或有依賴的,而工廠方法中的工廠是生産單一産品的工廠。
抽象工廠方法模式角色配置設定:
- AbstractFactory(抽象工廠角色) :是工廠方法模式的核心,與應用程式無關。任何在模式中建立的對象的工廠類必須實作這個接口。
- ConreteFactory(具體工廠類角色) :這是實作抽象工廠接口的具體工廠類,包含與應用程式密切相關的邏輯,并且受到應用程式調用以建立某一種産品對象。
- Abstract Product(抽象産品角色) :工廠方法模式所建立的對象的超類型,也就是産品對象的共同父類或共同擁有的接口。
- Concrete Product(具體産品角色) :抽象工廠模式所建立的任何産品對象都是某一個具體産品類的執行個體。在抽象工廠中建立的産品屬于同一産品族,這不同于工廠模式中的工廠隻建立單一産品。
舉一個栗子
建立 Shape 和 Color 接口和實作這些接口的實體類。
Shape:抽象形狀
package cn.personalweb.factory.Abstractfactor;
public interface Shape {
void draw();
}
具體形狀
package cn.personalweb.factory.Abstractfactor;
// 圓形
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("draw Circle");
}
}
// 正方形
public class Square implements Shape{
@Override
public void draw() {
System.out.println("draw Square");
}
}
// 矩形
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("draw Rectangle");
}
}
Color:抽象顔色
package cn.personalweb.factory.Abstractfactor;
public interface Color {
void fill();
}
具體顔色
package cn.personalweb.factory.Abstractfactor;
// 紅色
public class Red implements Color{
@Override
public void fill() {
System.out.println("fill red");
}
}
// 綠色
public class Green implements Color{
@Override
public void fill() {
System.out.println("fill green");
}
}
// 藍色
public class Blue implements Color {
@Override
public void fill() {
System.out.println("fill blue");
}
}
AbstracFactory:抽象工廠
package cn.personalweb.factory.Abstractfactor;
public abstract class AbstracFactory {
public abstract Shape getShape(String shape);
public abstract Color getColor(String color);
}
ColorFactory:具體顔色工廠
package cn.personalweb.factory.Abstractfactor;
public class ColorFactory extends AbstracFactory {
@Override
public Shape getShape(String shape) {
return null;
}
@Override
public Color getColor(String color) {
if (color == null) {
return null;
}
if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("BLUE")) {
return new Blue();
} else if (color.equalsIgnoreCase("GREEN")) {
return new Green();
}
return null;
}
}
ShapeFactory:具體形狀工廠
package cn.personalweb.factory.Abstractfactor;
public class ShapeFactory extends AbstracFactory {
@Override
public Shape getShape(String shape) {
if (shape == null) {
return null;
}
if (shape.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shape.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shape.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
FactoryProducer:工廠制造者
用于生成工廠
package cn.personalweb.factory.Abstractfactor;
public class FactoryProducer {
public static AbstracFactory getFactory(String factory) {
if (factory == null) {
return null;
}
if (factory.equalsIgnoreCase("SHAPE")) {
return new ShapeFactory();
} else if (factory.equalsIgnoreCase("COLOR")) {
return new ColorFactory();
}
return null;
}
}
Client:用戶端
package cn.personalweb.factory.Abstractfactor;
public class Client {
public static void main(String[] args) {
// 擷取形狀工廠
AbstracFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
// 通過形狀工廠擷取 circle
Shape circle = shapeFactory.getShape("CIRCLE");
circle.draw();
// 通過形狀工廠擷取 Rectangle
Shape rectangle = shapeFactory.getShape("RECTANGLE");
rectangle.draw();
// 擷取顔色工廠
AbstracFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color red = colorFactory.getColor("RED");
red.fill();
Color green = colorFactory.getColor("GREEN");
green.fill();
Map<Integer, Integer> map = new HashMap<>();
Set<Integer> integers = map.keySet();
}
}
輸出結果
draw Circle
draw Rectangle
fill red
fill green
參考資料:
工廠模式