温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解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