当前位置: 首页 >  网技达人 >  设计模式(二)工厂方法

设计模式(二)工厂方法

导读:一、前言.工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于23种经典设计模式,但通常将它作为学习其他工厂模式的基础。.二、简单工厂.1、定义.定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常都具有共同的父类。由于简单的工厂模式中用于创建实例的

一、前言

工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于23种经典设计模式,但通常将它作为学习其他工厂模式的基础。

二、简单工厂

1、定义

定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常都具有共同的父类。由于简单的工厂模式中用于创建实例的方法通常是静态方法,所以简单工厂又被称作为静态工厂。

2、例子

例:开发一套图表库,根据不同的参数可以创建柱状图BarChart,直线图LineChart,饼状图PieChart,下面使用简单工厂来实现。
Chart:抽象图表接口,充当抽象产品类

namespace _02_FactoryMethod
{
    internal interface Chart
    {
        void Display();
    }
}

BarChart:柱状图类,充当具体产品类

namespace _02_FactoryMethod
{
    class BarChart : Chart
    {
        public BarChart()
        {
            Console.WriteLine("创建柱状图");
        }

        public void Display()
        {
            Console.WriteLine("显示柱状图");
        }
    }
}

LineChart:折线图类,充当具体产品类

namespace _02_FactoryMethod
{
    internal class LineChart : Chart
    {
        public LineChart()
        {
            Console.WriteLine("创建折线图");
        }

        public void Display()
        {
            Console.WriteLine("显示折线图");
        }
    }
}

PieChart:饼图类,充当具体产品类

namespace _02_FactoryMethod
{
    internal class PieChart : Chart
    {
        public PieChart()
        {
            Console.WriteLine("创建饼图");
        }

        public void Display()
        {
            Console.WriteLine("显示饼图");
        }
    }
}

ChartFactory:图表工厂类,充当工厂类

namespace _02_FactoryMethod
{
    internal class ChartFactory
    {
        public static Chart GetChart(string type)
        {
            Chart chart = null;
            if (type.Equals("bar"))
            {
                chart = new BarChart();
            }
            else if (type.Equals("line"))
            {
                chart = new LineChart();
            }
            else if (type.Equals("pie"))
            {
                chart = new PieChart();
            }
            return chart;
        }
    }
}

Program:测试代码

Chart chart = ChartFactory.GetChart("bar");
chart.Display();

简单工厂也可以再简化,直接将抽象类和工厂类合并,因为并不是所有类型的产品都那么复杂。

3、总结

实际应用中,简单工厂肯定是难当大任的,工厂类职责过重,一旦出现问题,整个程序直接崩溃,而且产品类不易拓展,新增就意味着改代码。当然,如果只是一个简单程序,配合使用反射、配置文件等手段可以快速完成开发,相信大家都“吃过猪肉也见过猪跑”。

三、工厂方法

1、定义

定义一个用于创建对象的接口,但是让子类决定将哪一个实例化。工厂方法模式让一个类的实例化延迟到其子类,是一种创建型模式。与简单工厂相比,引入了抽象工厂角色。工厂方法模式包含以下四个角色:

1、Product(抽象产品): 它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
2、ConcreteProduct(具体产品): 它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
3、Factory(抽象工厂): 在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
4、ConcreteFactory(具体工厂): 它是抽象工厂类的子类,实现了在抽象工厂中声明的工厂方法,由客户端调用,返回一个具体产品类的实例。

2、例子

例:系统封装多种记录日志方式,包括文件记录日志、数据库记录日志等,可以根据需求切换。
LoggerFactory:抽象产品工厂接口,供具体产品(数据库记录日志、文件记录日志)工厂继承,实现创建具体产品类的方法

public interface LoggerFactory
{
    public Logger CreateLogger();
}

DataBaseLoggerFactory:数据库记录日志工厂类,继承抽象产品工厂接口

public class DataBaseLoggerFactory : LoggerFactory
{
    public Logger CreateLogger()
    {
        //创建数据库业务代码略
        Logger logger = new DataBaseLogger();
        return logger;
    }
}

FileLoggerFactory:文件记录日志工厂类,继承抽象产品工厂接口

public class FileLoggerFactory : LoggerFactory
{
    public Logger CreateLogger()
    {
        //创建文件业务代码略
        Logger logger = new FileLogger();
        return logger;
    }
}

Logger:抽象产品接口,供具体产品类继承,实现记录日志的具体方法

public interface Logger
{
    void WriteLog();
}

DataBaseLogger:数据库记录日志类,继承抽象产品

public class DataBaseLogger : Logger
{
    public void WriteLog()
    {
        Console.WriteLine("数据库记录日志");
    }
}

FileLogger:文件记录日志类,继承抽象产品

public class FileLogger : Logger
{
    public void WriteLog()
    {
        Console.WriteLine("文件记录日志");
    }
}

Program:客户端测试类

LoggerFactory loggerFactory = new DataBaseLoggerFactory();
Logger logger = loggerFactory.CreateLogger();
logger.WriteLog();

3、总结

工厂方法模式除了包含简单工厂的优点,还弥补了不足,当需要添加新产品时,只需要添加一个具体工厂和具体产品即可,无需改动已有代码,增强系统可扩展性,符合开闭原则。当然这同时也增加了系统的理解难度,具体产品类过多的话,系统将变得无比庞大。

内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 裙子
    裙子
    2023-12-16
    裙子.产品描述.我们的裙子采用高品质的面料制成,款式多样,适合各种场合穿着。无论是休闲的街头漫步,还是正式的商务会议,我
  • 儿童背带裤
    儿童背带裤
    2023-12-11
    儿童背带裤.产品功能.舒适性:儿童背带裤采用柔软舒适的面料,让宝宝在活动中感到自由自在。.便捷性:背带裤采用可调节的肩带
  • 外套
    外套
    2023-12-06
    外套.外套是一种经典的服装单品,不仅给人温暖的保护,还可以提升整体的时尚感。我们的外套采用高品质的材料和工艺**而成,既
  • 袜子
    袜子
    2023-12-26
    产品介绍.产品功能.我们的袜子采用了优质的天然材料,具有吸湿透气、舒适柔软的特点。特别设计的弹性帮助固定袜子位置,并且不
  • 短裤
    短裤
    2023-12-11
    时尚舒适,让您夏日更自在.产品功能.采用轻薄、透气的面料,给您清新舒适的穿着体验.弹性腰头设计,更贴合您的腰部曲线,穿着
  • 连衣裙
    连衣裙
    2024-01-20
    连衣裙.产品功能.舒适的穿着体验.时尚的设计风格.多种款式选择.适用于多种场合.产品描述.我们的连衣裙采用高品质的面料,
  • 儿童外套
    儿童外套
    2023-12-06
    儿童外套.产品功能.我们的儿童外套具有多种功能,包括保暖、防风、防水和舒适。它们采用高质量的面料制成,能够有效地抵御寒冷
  • 儿童衬衫
    儿童衬衫
    2024-01-20
    儿童衬衫.产品功能.舒适的面料,透气性好,适合孩子穿着.简约时尚的设计,适合各种场合穿着.多种颜色和图案选择,满足不同孩
  • 衬衫
    衬衫
    2023-12-31
    产品介绍:衬衫.产品功能.衬衫是一种适合各种场合穿着的服装,既可以正式地穿在工作场所,也可以搭配牛仔裤穿在休闲场合。.衬
  • 牛仔裤
    牛仔裤
    2024-01-05
    牛仔裤.牛仔裤,是一种起源于美国的经典服装单品,以其耐穿耐磨的特性,成为了时尚界不可或缺的一部分。无论是男女老少,都能在