設計模式(一)簡單工廠、工廠方法和抽象工廠

簡單工廠模式

定義:

  • 簡單工廠模式屬於類的建立型模式,又叫作靜態工廠方法模式。經過專門定義一個類(Factory)來負責建立其餘類的實例,被建立的實例一般都具備共同的父類(接口)。

簡單工廠模式中的角色和職責:

  • 工廠(Creator):簡單工廠模式的核心,它負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所需的產品對象。mysql

  • 抽象(Product):簡單工廠模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。sql

  • 具體產品(Concrete Product):簡單工廠模式所建立的具體實例對象。數據庫

示例:

  • 抽象:oracle

    public interface Fruit {
    
        /* 採集水果 */
        public void get();
    }
  • 工廠:app

    public class FruitFactory {
    
        public static Fruit getFruit(String type) {
            try {
                if (type.equalsIgnoreCase("apple")) {
                    return Apple.class.newInstance();
    
                } else if (type.equalsIgnoreCase("banana")) {
                    return Banana.class.newInstance();
                } else {
                    System.out.println("沒有這個類");
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    
        }
    }
  • 具體產品:框架

    //實現1
    public class Apple implements Fruit {
    
        public void get() {
            System.out.println("採集蘋果");
        }
    }
    
    //實現2
    public class Banana implements Fruit{
    
        public void get(){
            System.out.println("採集香蕉");
        }
    }
  • 測試類ide

    public class MainClass {
        public static void main(String[] args) {
    
            Fruit apple = FruitFactory.getFruit("Apple");
            Fruit banana = FruitFactory.getFruit("banana");
            apple.get();
            banana.get();
        }
    }

優缺點:

  • 優勢:用戶在使用時能夠直接根據工廠類去建立所需的實例,而無
    需瞭解這些對象是如何建立以及如何組織的。有利於整個軟件體系結構的優化。測試

  • 缺點:
    • 因爲工廠類集中了全部實例的建立邏輯,因此「高內聚」方面作的並很差。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要作相應的修改,擴展性並不很好。優化

    • 簡單工廠模式適合擁有固定的實現類,當別人設計好以後,咱們只須要調用就好了,但違反了開放-封閉的原則,想要增長新的實現類,就必需要修改工廠方法。ui

應用:

  • 在Dao層的實現上,如在MVC框架層上定義一個接口,其中有多個實現類,咱們不須要理解實現類是怎樣實現的,只須要經過父類建立子類的對象便可。

  • 如在鏈接數據庫的時候,框架給咱們提供了一個管理數據庫鏈接的工廠類,在實現類中可能有多個實現類(mysql , mssql , oracle等),咱們只須要經過工廠類建立出實現類的對象便可。

工廠方法模式(多態工廠模式)

定義:

  • 工廠方法模式的意義是定義一個建立產品對象的工廠接口(FruitFactory接口),將實際建立工做推遲到子類當中(BananaFactory implements FruitFactory 等)。核心工廠類再也不負責產品的建立,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可使系統在不修改具體工廠角色的狀況下引進新的產品。

工廠方法模式中的角色和職責:

  • 抽象工廠(Creator): 工廠方法模式的核心,任何工廠類都必須實現這個接口。

  • 具體工廠( Concrete Creator): 具體工廠類是抽象工廠的一個實現,負責實例化產品對象。

  • 抽象(Product): 工廠方法模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。

  • 具體產品(Concrete Product): 工廠方法模式所建立的具體實例對象。

示例:

  • 核心工廠(抽象工廠):負責管理工廠,不負責工廠的建立

    public interface FruitFactory {
    
        public Fruit getFruit();
    }
  • 具體工廠:負責對各個實例的初始化

    public class BananaFactory implements FruitFactory {
    
        @Override
        public Fruit getFruit() {
    
            return new Banana();
        }
    
    }
    
    public class AppleFactory implements FruitFactory {
    
        @Override
        public Fruit getFruit() {
            return new Apple();
        }
    
    }
  • 抽象:全部實例化對象都擁有的方法

    public interface Fruit {
    
        /* 採集水果 */
        public void get();
    }
  • 具體產品

    public class Apple implements Fruit {
    
        public void get() {
            System.out.println("採集蘋果");
        }
    }
    
    public class Banana implements Fruit{
    
        public void get(){
            System.out.println("採集香蕉");
        }
    }
  • 測試建立類

    public class MainClass {
        public static void main(String[] args) {
    
            FruitFactory appleFactory = new AppleFactory();
            Fruit apple = appleFactory.getFruit();
            apple.get();
    
            FruitFactory bananaFactory = new BananaFactory();
            Fruit banana = bananaFactory.getFruit();
            banana.get();
    
        }
    }

好處

  當系統擴展須要添加新的產品對象時,僅僅須要添加一個具體對象以及一個具體工廠對象,原有工廠對象不須要進行任何修改,也不須要修改客戶端,很好的符合了「開放-封閉」原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性很差。

抽象工廠模式

  • 定義:抽象工廠模式是全部形態的工廠模式中最爲抽象和最其通常性的。抽象工廠模式能夠向客戶端提供一個接口,使得客戶端在沒必要指定產品的具體類型的狀況下,可以建立多個產品族的產品對象。

  • 抽象工廠中角色和職責

    • 抽象工廠(Creator):抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。

    • 具體工廠( Concrete Creator):具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。

    • 抽象(Product):抽象模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。

    • 具體產品(Concrete Product):抽象模式所建立的具體實例對象。

    抽象工廠中方法對應產品結構,具體工廠對應產品族。

產品族和產品等級結構

產品族和產品等級結構

舉例

  • 抽象工廠:

    public interface FruitFactory {
        //實例化Apple
        public Fruit getApple();
        //實例化Banana
        public Fruit getBanana();
    }
  • 抽象:

    public abstract class Banana implements Fruit{
        /*
         * 採集
         */
        public abstract void get();
    }
    
    public abstract class Apple implements Fruit {
    
        /*
         * 採集
         */
        public abstract void get(); 
    }
  • 具體工廠

    public class NorthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new NorthApple();
        }
    
        public Fruit getBanana() {
            return new NorthBanana();
        }
    
    }
    
    public class SouthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new SouthApple();
        }
    
        public Fruit getBanana() {
            return new SouthBanana();
        }
    
    }
  • 具體產品:

    public class NorthBanana extends Banana {
    
        public void get() {
            System.out.println("採集北方香蕉");
        }
    
    }
    
    public class NorthApple extends Apple {
    
        public void get() {
            System.out.println("採集北方蘋果");
        }
    
    }
    
    public class SouthApple extends Apple {
    
        public void get() {
            System.out.println("採集南方蘋果");
        }
    
    }
    
    public class SouthBanana extends Banana {
    
        public void get() {
            System.out.println("採集南方香蕉");
        }
    
    }
  • 測試類

    public class MainClass {
        public static void main(String[] args) {
            FruitFactory ff = new NorthFruitFactory();
            Fruit apple = ff.getApple();
            apple.get();
    
            Fruit banana = ff.getBanana();
            banana.get();
    
            FruitFactory ff2 = new SouthFruitFactory();
            Fruit apple2 = ff2.getApple();
            apple2.get();
    
            Fruit banana2 = ff2.getBanana();
            banana2.get();
    
        }
    }

對工廠方法的使用舉例:

http://blog.csdn.net/dawanganban/article/details/9884681

相關文章
相關標籤/搜索