当前位置: 首页 > article >正文

设计模式(二)-创建者模式(2-0)-简单工厂模式

一、简单工厂模式定义

客户端不需要关注创建实例的过程。于是需要通过工厂模式,要把创建对象过程和使用对象进行分离。所以客户端只要使用对象即可,而创建对象过程由一种类来负责,该类称为工厂类。

由于创建实例的方式是在静态方法里实现的,所以简单工厂模式也称为静态工厂方法模式。

特点: 创建一个工厂类,根据不同的参数来创建不同类的对象,并把该对象返回给共同的一个基类。

优点: 创建对象时,客户端不需要处理整个创建逻辑的过程。只要输入参数就可生成对应的对象。

缺点: 1)如果工厂类存在代码逻辑的错误,一经修改后,整个系统都要受到影响。2)增加了新的实现类,工厂类里静态方法也多加了一个新的创建对象,也就增加了系统的复杂度。

合理应用条件

  • 客户端不需要关心创建对象。
  • 创建的对象比较少,创建的类是比较少。

角色
抽象基类: 用以定义特征和行为的抽象接口。
实现类: 继承抽象基类,用以实现特征和行为的具体类。
工厂类: 根据不同的参数,创建不同的实现类,并赋值给基类。

请添加图片描述

二、例子

需求:
提供一辆汽车和一辆自行车。

// Vehicle 作为抽象基类
    public abstract class Vehicle
    {
        public abstract void make();
    }
// Car 继承 Vehicle 的行为特征
    public class Car : Vehicle
    {
        public override void make() {
            Console.WriteLine("Produce a Car");
        }
    }
// Bicycle 继承 Vehicle 的行为特征
    public class Bicycle : Vehicle
    {
        public override void make(){
            Console.WriteLine("Produce a Bicycle");
        }
    }

//工厂类,负责根据不同的参数来创建实现类对象。
    public static class Factory
    {
        public static Vehicle CreateVehicle(string arg) {
            Vehicle vehicle = null;
            switch(arg)
            {
                case "Car":
                    vehicle = new Car(); break;
                case "Bicycle":
                    vehicle = new Bicycle(); break;
                default:
                    throw new ArgumentException("arg Invalid.new obj failed.");
            }

            return vehicle;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        //使用实现类对象,Factory 对客户端隐藏了创建细节。
            Vehicle car = Factory.CreateVehicle("Car");
            car.make();

            Vehicle bicycle = Factory.CreateVehicle("Bicycle");
            bicycle.make();

            Console.ReadLine();
        }
    }


http://www.kler.cn/a/134252.html

相关文章:

  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数
  • RHCE的学习(16)(shell脚本编程)
  • Docker入门系列——Docker-Compose
  • 第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)
  • Electron 项目中杀掉进程的不同方式
  • 鸿蒙next打包流程
  • CocoaPods podfile 文件配置
  • 丹麦能源袭击预示着更关键的基础设施成为目标
  • UOS统信操作系统QIcon::fromTheme详解
  • 翻译软件Mate Translate mac中文版介绍说明
  • NewStarCTF2023 Reverse Week3 EzDLL WP
  • nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
  • c语言中*p1++和p1++有啥区别
  • 大数据Doris(二十五):Stream Load数据导入演示和其他导入案例
  • android适配鸿蒙系统开发
  • 说一说HTTP1.0、1.1、2.0版本区别和优化
  • c++中的String
  • 【算法】石子合并(区间dp)
  • Python学习之——正则表达式
  • 深度学习入门(第三天)——卷积神经网络
  • LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  • 系统移植-uboot
  • 012 C++ AVL_tree
  • 创邻科技亮相ISWC 2023,国际舞台见证知识图谱领域研究突破
  • 【kerberos】使用 curl 访问受 Kerberos HTTP SPNEGO 保护的 URL
  • 单张图像3D重建:原理与PyTorch实现