中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java簡單工廠模式

發布時間:2021-11-05 17:55:10 來源:億速云 閱讀:120 作者:柒染 欄目:開發技術

本篇文章為大家展示了如何理解Java簡單工廠模式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

    簡單工廠模式概述

    1.定義:定義一個工廠類,他可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類

    2.在簡單工廠模式中用于被創建實例的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法(Static Factory Method)

    3.需要什么,只需要傳入一個正確的參數,就可以獲取所需要的對象,而無需知道其實現過程

    4.例如,我開一家披薩店,當客戶需要某種披薩并且我這家店里也能做的時候,我就會為其提供所需要的披薩(當然是要錢的哈哈),如果其所需的我這沒有,則是另外的情況,后面會談。這時候,我這家 披薩店就可以看做工廠(Factory),而生產出來的披薩被成為產品(Product),披薩的名稱則被稱為參數,工廠可以根據參數的不同返回不同的產品,這就是簡單工廠模式

    簡單工廠模式的結構與實現

    結構:

    如何理解Java簡單工廠模式

    1.Factory(工廠):核心部分,負責實現創建所有產品的內部邏輯,工廠類可以被外界直接調用,創建所需對象

    2.Product(抽象類產品):工廠類所創建的所有對象的父類,封裝了產品對象的公共方法,所有的具體產品為其子類對象

    3.ConcreteProduct(具體產品):簡單工廠模式的創建目標,所有被創建的對象都是某個具體類的實例。它要實現抽象產品中聲明的抽象方法(有關抽象類)

    實現

    abstract class Product
    {
        public void MethName()
        {
            //公共方法的實現
        }
        public abstract void MethodDiff();
        //聲明抽象業務方法
    }
    class ConcreteProductA : Product
    {
        public override void MethodDiff()
        {
            //業務方法的實現
        }
    }
    class Factory
    {
        public static Product GetProduct(string arg)
        {
            Product product =  null;
            if(arg.Equals("A")
            {
                product = new ConcreteProductA();
                //init
            }
            else if(arg.Equals("B"))
            {
                product = new ConcreteProductB();
                //init
            }
            else
            {
            ....//其他情況
            }
            return product;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Product product;
            product = Factory.GetProduct("A");//工廠類創建對象
            Product.MethName();
            product.MethodDiff();
        }
    }

    簡單工廠模式的簡化

    1.為了簡化簡單工廠模式,將抽象產品類和工廠類合并,將靜態工廠方法移到抽象產品類中

    如何理解Java簡單工廠模式

    客戶端可以調用產品父類的靜態工廠方法,根據不同的參數創建不同類型的產品子類對象。

    簡單工廠模式的優缺點和適用環境

    簡單工廠模式的優點

    (1)工廠類包含必要的邏輯判斷,可以決定在什么時候創建哪一個產品的實例。客戶端可以免除直接創建產品對象的職責

    (2)客戶端無需知道所創建具體產品的類名,只需知道參數即可

    (3)也可以引入配置文件,在不修改客戶端代碼的情況下更換和添加新的具體產品類。(這也是我在開始的披薩店里遇到沒有的披薩的解決情況)

    簡單工廠模式的缺點

    (1)工廠類集中了所有產品的創建邏輯,職責過重,一旦異常,整個系統將受影響

    (2)使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的復雜度和理解難度

    (3)系統擴展困難,一旦增加新產品不得不修改工廠邏輯,在產品類型較多時,可能造成邏輯過于復雜

    (4)簡單工廠模式使用了static工廠方法,造成工廠角色無法形成基于繼承的等級結構。

    簡單工廠模式的適用環境

    (1)工廠類負責創建對的對象比較少,因為不會造成工廠方法中的業務邏輯過于復雜

    (2)客戶端只知道傳入工廠類的參數,對如何創建對象不關心

    簡單案例

    題目:

    使用簡單工廠模式設計一個可以創建不同幾何圖形(Shape),如Circle,Rectangle,Triangle等繪圖工具類,每個幾何圖形均具有繪制Draw()和擦除Erase()兩個方法要求在繪制不支持的幾何圖形時,拋出一個UnsuppShapeException異常,繪制類圖并使用C#語言實現。

    UML:

    如何理解Java簡單工廠模式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    /*使用簡單工廠模式設計一個可以創建不同幾何圖形(Shape),如Circle,Rectangle,Triangle等繪圖工具類,每個幾何圖形均具有繪制Draw()和擦除Erase()兩個方法
     * 要求在繪制不支持的幾何圖形時,拋出一個UnsuppShapeException異常,繪制類圖并使用C#語言實現。
    */
    namespace SimpleShapeFactory
    {
        public interface InShape//圖形接口 抽象產品類
        {
            void Draw();
            void Erase();
        }
        public class Circle : InShape//圓形類,具體產品類
        {
            private static int count;   //生成圖形計數
            string radious;
            public Circle()//構造
            {
                Console.WriteLine("Create Circle");
                Console.WriteLine("Input the radious of Circle:");
                radious = Console.ReadLine();
            }
            public void Draw()//實現接口方法
            {
                int Radious = int.Parse(radious);
                Console.WriteLine("Display circle " + (++count) +" information:");
                Console.WriteLine("Circle "+ count+ " circumference:" + 2 * Radious * 3.14159);
                Console.WriteLine("Circle "+ count+" area:" + 3.14159 * Radious * Radious);
            }
            public void Erase()//實現接口方法
            {
                while (true)
                {
                    Console.WriteLine("Erase current shape(y/n)?");
                    string choose;
                    choose = Console.ReadLine();
                    if (choose.Equals("y") || choose.Equals("Y"))
                    {
                        Console.WriteLine("Erase Circle "+count +" successfully!");
                        count--;
                        break;
                    }
                    else if (choose.Equals("n") || choose.Equals("N"))
                    {
                        Console.WriteLine("Circle "+ count+" successfully saved!");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Input error, re-enter!");
                    }
                }
            }
        }
        class Rectangle : InShape//矩形類,具體產品類
        {
            private static int count = 0;//生成圖形計數
            string length;
            string wideth;
            public Rectangle()//構造
            {
                Console.WriteLine("Create Rectangle");
                Console.WriteLine("Input the length and wideth of Rectangle:");
                length = Console.ReadLine();
                wideth = Console.ReadLine();
            }
            public void Draw()//實現接口方法
            {
                int Length = int.Parse(length);
                int Wideth = int.Parse(wideth);
                Console.WriteLine("Display rectangle " + (++count) + " information:");
                Console.WriteLine("Rectangle "+ count + "circumference:" + 2 * Length * Wideth);
                Console.WriteLine("Rectangle "+ count + "area:" + Length * Wideth);
            }
            public void Erase()//實現接口方法
             {
                 while (true)
                 {
                     Console.WriteLine("Erase current shape(y/n)?");
                     string choose;
                     choose = Console.ReadLine();
                     if (choose.Equals("y") || choose.Equals("Y"))
                     {
                         Console.WriteLine("Erase rectangle "+count+ "successfully!");
                         --count;
                         break;
                     }
                     else if (choose.Equals("n") || choose.Equals("N"))
                     {
                         Console.WriteLine("Rectangle "+ count+" successfully saved!");
                         break;
                     }
                     else
                     {
                         Console.WriteLine("Input error, re-enter!");
                     }
                 }
            }
        }
        class Triangle : InShape//三角形類,具體產品類
        {
            private static int count = 0;//生成圖形計數
            string lengtha;
            string lengthb;
            string lengthc;
            public Triangle()//構造
            {
                Console.WriteLine("Create Triangle");
                Console.WriteLine("Input the lengtha ,lengthb and lengthc of Triangle:");
                lengtha = Console.ReadLine();
                lengthb = Console.ReadLine();
                lengthc = Console.ReadLine();
            }
            public void Draw()//實現接口方法
            {
                int Lengtha = int.Parse(lengtha);
                int Lengthb = int.Parse(lengthb);
                int Lengthc = int.Parse(lengthc);
                if ((Lengtha + Lengthb > Lengthc) && (Lengtha + Lengthc > Lengthb) && (Lengthb + Lengthc > Lengtha))
                {
                    double S = (Lengtha + Lengthb + Lengthc) * 0.5;
                    double area = Math.Sqrt(S * (S - Lengtha) * (S - Lengthb) * (S - Lengthc));
                    Console.WriteLine("Display triangle "+ (++count)+" information:");
                    Console.WriteLine("Triangle " + count +" circumference:" + (Lengtha + Lengthb + Lengthc));
                    Console.WriteLine("Triangle "+ count +" area:" + area);
                    Erase();
                }
                else
                {
                    Console.WriteLine("Create triangle failed!");
                }
            }
            public void Erase()//實現接口方法
             {
                 while (true)
                 {
                     Console.WriteLine("Erase shape(y/n)?");
                     string choose;
                     choose = Console.ReadLine();
                     if (choose.Equals("y") || choose.Equals("Y"))
                     {
                         Console.WriteLine("Erase tirangle " +count +" successfully!");
                         --count;
                         break;
                     }
                     else if (choose.Equals("n") || choose.Equals("N"))
                     {
                         Console.WriteLine("Triangle "+ count +" successfully saved!");
                         break;
                     }
                     else
                     {
                         Console.WriteLine("Input error, re-enter!");
                     }
                 }
            }
        }
        class ShapeFactory//圖形工廠類,充當工廠類
        {
            public static  InShape Getshape(string type)//靜態工廠方法
            {
                InShape shape;
                shape = null;
                if (type.Equals("Circle"))
                {
                    shape = new Circle();
                    Console.WriteLine("Init set Circle");
                    shape.Draw();
                    shape.Erase();
                }
                else if(type.Equals("Rectangle"))
                {
                    shape = new Rectangle();
                    Console.WriteLine("Init set Rectangle");
                    shape.Draw();
                    shape.Erase();
                }
                else if (type.Equals("Triangle"))
                {
                    shape = new Triangle();
                    Console.WriteLine("Init set Triangle");
                    shape.Draw();
                }
                else//異常 這里我應該聲明調用異常處理類的,那樣會更好些
                {
                    Console.WriteLine("UnsupportShapeException!");
                    Console.WriteLine("Emotional reminders :Pay 1 million$ to Alipay:132****6151 can create every shape you want!!! ");
                }
                return shape;
            }
        }
        class Program//客戶端測試類
        {
            static void Main(string[] args)
            {
                while (true)
                {
                    InShape shape;
                    Console.WriteLine("Please input the shape you want to create");
                    string str = Console.ReadLine();
                    shape = ShapeFactory.Getshape(str);//通過靜態工廠方法創建產品
                    Console.ReadLine();
                }
            }
        }
    }

    運行結果:

    如何理解Java簡單工廠模式

    上述內容就是如何理解Java簡單工廠模式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    乐山市| 日喀则市| 莱西市| 鄂托克旗| 通渭县| 罗江县| 平谷区| 盐山县| 彭阳县| 温州市| 东乌珠穆沁旗| 门头沟区| 冷水江市| 绥化市| 泸定县| 武川县| 无为县| 聂荣县| 新源县| 静海县| 玉山县| 鄂州市| 萨迦县| 巴东县| 雅江县| 宁河县| 山阳县| 武邑县| 镇雄县| 周至县| 广西| 德保县| 宜兴市| 马公市| 花莲县| 潮州市| 辽宁省| 招远市| 夏河县| 江阴市| 会昌县|