简单工厂模式

因为刚开始学习c#不久,所以对c#中的知识懂的很少,也希望能有一些朋友一起学习或者高手前辈给予点指点,我知道我现在写的东西有很多问题,我也只是把我知道的那一点写出来,希望各位大婶婶多多指教。


我个人理解的简单工厂模式:

1.首先根据题意定义父类(基类),父类中包含需要的数据,并通过构造函数给予赋值,同时还需要一个virtual方法;

2.根据题意定义子类(派生类),子类继承父类,子类中的构造函数也base父类的构造函数,同时 重写(override)父类中方法;

3.定义工厂类,该类的返回值类型我一般写的是父类,工厂内是根据题意写的语句。

4.在主函数中调用工厂类。

下面举一个学习的例子:

磁盘上有不同的文件,比如:.txt文本文件、.avi视频文件、.xls电子表格。要求:编写一个控制台程序,用户输入一个带后缀名的文件,将该文件名传递到一个方法中,该方法中根据用户输入的文件名后缀,返回一个对应的文件对象。提示:编写不同的类模拟不同的文件、为不同的文件类创建统一的父类、使用简单工厂实现。




按照步骤来:

1.先根据题意定义父类CommonFile ,父类中有两个字段filename(文件名),extension(文件拓展名),构造函数,虚函数方法一个。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
    /// <summary>
    /// 文件的父类,提供统一的方法
    /// </summary>
    class CommonFile
    {
        string fileName;
        string extension;
        public string FileName
        {
            get { return fileName; }
            set { fileName = value; }
        }
        public string Extention
        {
            get { return extension; }
            set { extension = value; }
        }

        public CommonFile(string fileName)
        {
            this.fileName = fileName;
            // 在类中,直接使用字段即可,除非
            // 属性对字段有约束,或者是自动属性

            // 获得文件后缀名
            // 使用 string Path.GetExtension(文件名)
            this.extension = System.IO.Path.GetExtension(this.fileName);
        }

        public virtual void OpenFile()
        {
            Console.WriteLine("【{0}】文件,未知文件名后缀,不知如何打开", this.fileName);
        }
    }
}

2.再定义子类TextFile(这里子类就先定义一个txt的)子类继承父类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
    class TextFile:CommonFile
    {
        /// <summary>
        /// 提供构造方法,调用父类构造方法为字段赋值
        /// </summary>
        /// <param name="fileName"></param>
        public TextFile(string fileName)
            : base(fileName)
        { }

        public override void OpenFile()
        {
            Console.WriteLine("【{0}】文件是文本文件,后缀名是\"{1}\",使用文本文件将其打开", this.FileName, this.Extention);
        }
    }
}

3..定义工厂类Factory,返回值类型CommonFile

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
    /// <summary>
    /// 这个是工厂对象
    /// </summary>
    class Factory
    {
        public static CommonFile InitialFileObject(string fileName)
        {
            switch (System.IO.Path.GetExtension(fileName).ToLower())
            { 
                case ".txt":
                case "txt": return new TextFile(fileName);

                default: return new CommonFile(fileName);
            }

        }
    }
}

4.主函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
    class Program
    {
        static void Main(string[] args)
        {
            // 提示用户输入
            Console.WriteLine("请输入文件");
            // 接收数据
            string fileName = Console.ReadLine();
            // 将用户输入的文件名交给工厂
            CommonFile file = Factory.InitialFileObject(fileName);

            file.OpenFile();

            Console.ReadKey();
        }
    }
}

5.结果




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值