首页 > 其他分享 >设计模式(二)工厂方法

设计模式(二)工厂方法

时间:2023-08-18 11:56:14浏览次数:32  
标签:工厂 抽象 产品 日志 设计模式 方法 public Logger

一、前言

工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于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、总结

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

标签:工厂,抽象,产品,日志,设计模式,方法,public,Logger
From: https://www.cnblogs.com/WinterSir/p/16646963.html

相关文章

  • yum下载常用方法
    yum自动下载RPM包及其所有依赖的包至/root/rpm目录:yuminstall--downloadonly--downloaddir=/root/rpm<package-name>切换到下载目录rpm中批量安装rpm-ivh*--nodeps--forceyum命令本身就可以用来下载一个RPM包,标准的yum命令提供了downloadonly(只下载)的选项来达到这个......
  • 一文带你读懂设计模式之责任链模式 | 京东云技术团队
    1.前言emm,翻了一下之前刚入职时候的学习笔记,发现之前在熟悉业务代码的时候曾经专门学习并整理过过设计模式中的责任链模式,之前只是对其简单了解过常用的设计模式有哪些,并未结合实例和源码深入对其探究,利用熟悉代码契机进行系统学习并整理文档如下。2.什么是责任链模式?俗话说没有规......
  • Python字符串定义的三种方法!
    字符串是Python编程语言中的基本数据类型,也是Python编程中非常重要的数据类型之一。在Python中,我们可以通过三种不同的方式来定义字符串,分别是:单引号、双引号、三引号,接下来是具体的内容介绍。1、使用单引号在Python中,使用单引号来定义字符串是最基本的方式。单引号用......
  • 优化视频流:利用美颜SDK提升直播质量的方法
    随着互联网的迅猛发展,视频直播已成为人们分享、交流和娱乐的重要方式。然而,在实际的直播过程中,视频画质可能受到诸多因素的影响,例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众,美颜技术逐渐成为了直播平台不可或缺的一部分。本文将探讨如何利用美颜SDK来优化视频......
  • linux中磁盘清理方法(简单好用)
    文章目录1.命令2.df参数说明3.find参数说明4.清理日志文件1.命令先来看解决办法df-h --显示当前磁盘使用情况cd/ --cd到要清理文件的路径下面find.-typef-size+300M --查找大于300M的文件123依次显示为:文件系统,容量,已用空间,可用空间,挂载点 2.df参数说明df-h1-a:列出所......
  • 【已解决】docker overlay2占用大量磁盘空间处理方法
    在使用docker容器的时候遇到了容量上的问题,做一个记录处理方式1:在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容。此时,可通过手动或定时任务进行清除。针对/var/lib/docker/overlay2空间占用很大网上提供了很多解决方......
  • Prototype 原型模式简介与 C# 示例【创建型4】【设计模式来了_4】
    〇、简介1、什么是原型模式?一句话解释:  针对比较耗时的对象创建过程,通过原型的Clone方法来克隆对象,而非重新创建。原型设计模式(PrototypeDesignPattern)是一种创建型设计模式,其主要目的是通过复制已有对象来创建新的对象,而无需通过实例化类并初始化其属性。这种模式在需......
  • 在Android Studio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的
    在AndroidStudio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的方法:**方法一:使用插件:**1.打开AndroidStudio,点击顶部菜单中的"File"(文件)。2.选择"Settings"(设置)或"Preferences"(首选项),然后在弹出的窗口中选择"Plugins"(插件)。3.在搜索框中输入"Code......
  • java私有方法单元测试
    使用junit5,类的代码为packagecom.sysush.tool;publicclassTool1{privatevoidhelloworld(){System.out.println("helloworld");}privateintadd(Integera,Integerb){returna+b;}}测试代码为:importorg.junit.jupiter.api.Test;importjava.lang......
  • 安森美 IDE(基于Eclipse)报头文件缺少的解决方法
    安森美IDE(基于Eclipse)报头文件缺少,但是能正常跳转到头文件在这里面将路径包含进来,建议两个都添加一次  在项目上点击右键,然后点击Index下的Rebuild重建 ......