zoukankan      html  css  js  c++  java
  • 工厂方法模式(Factory Method)

    1.1 定义

    工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

    1.2 主要作用

    将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

    1.3 解决的问题

    工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关闭原则

    1. 即简单工厂模式的缺点
    2. 之所以可以解决简单工厂的问题,是因为工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则,克服了简单工厂模式中缺点

    实现代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesignPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                FactoryCreator factoryCreator = new BlackCarFactoryMethod();
    
               // FactoryCreator factoryCreator = new OriangeFactoryMethod();
    
                factoryCreator._AuthCar().CreatorCar();
    
                Console.ReadKey();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesignPattern
    {
        /// <summary>
        /// 工厂类
        /// </summary>
        public abstract class FactoryCreator
        {
            /// <summary>
            /// 获取汽车对象
            /// </summary>
            /// <returns></returns>
            public abstract AuthCar _AuthCar();
        }
    
        /// <summary>
        /// 得到黑色汽车实例
        /// </summary>
        public class BlackCarFactoryMethod : FactoryCreator
        {
            public override AuthCar _AuthCar()
            {
                return new _BlackCar();
            }
        }
        /// <summary>
        /// 得到橘黄色汽车实例
        /// </summary>
        public class OriangeFactoryMethod : FactoryCreator
        {
            public override AuthCar _AuthCar()
            {
                return new _OriangeCar();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesignPattern
    {
        /// <summary>
        /// 汽车抽象类
        /// </summary>
        public abstract class AuthCar
        {
            /// <summary>
            /// 输出制造了什么汽车
            /// </summary>
            public abstract void CreatorCar();
        }
    
        /// <summary>
        /// 派生类-橘黄色轿车
        /// </summary>
        public class _OriangeCar : AuthCar
        {
            public override void CreatorCar()
            {
                Console.WriteLine("生产了橘黄色轿车!");
            }
        }
    
        /// <summary>
        /// 派生类-黑色轿车
        /// </summary>
        public class _BlackCar : AuthCar
        {
            public override void CreatorCar()
            {
                Console.WriteLine("生产了黑色轿车");
            }
        }
    }
  • 相关阅读:
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Makefile 自动生成依赖
    比较详细的利用虚拟机对SD卡FAT32+EXT4+Ext4分区图解教程
    STM32F0308开发环境的选择--CooCox CoIDE篇
    linux下包管理命令yum与apt-get以及开发环境配置
    裸机编程与OS环境编程的有关思考
    Eclipse C/C++环境配置
    Linux Eclipse代码提示功能设置(Java & C/C++)
    Linux下高效编写Shell——shell特殊字符汇总
  • 原文地址:https://www.cnblogs.com/macT/p/11803884.html
Copyright © 2011-2022 走看看