C#设计模式——简单工厂模式实现:超市收银系统

一、超市收银系统:

在上一篇中简单介绍了简单工厂模式,在理论方面应该清楚了这是个什么东西用来处理什么情况和它的优缺点,现在来看看应用简单工厂模式的一个现实情境——超市收银系统。在现实生活中商品、仓库、超市、顾客就是一条链子,通过这条链子不论是顾客买商品或者是超市管理商品都得到非常方便的效果,超市也会有一些优惠的方案,这次我们就通过简单工厂模式来实现我们现实生活中超市收银的情况。

二、逻辑思路:

1、产品:

1-1、创建产品父类,产品有价格、名称、ID等公共属性。

1-2、创建各产品子类,继承于产品父类。

2、计算价格:

2-1、创建计算价格父类,抽象出计算总价方法。

2-2、创建计算价格无优惠子类。

2-3、创建计算价格满减优惠子类。

2-4、创建计算价格打折优惠子类。

3、仓库:

3-1、创建仓库类,给每个产品子类都创建一个集合(各自的货架)。

3-2、仓库需要有货才叫仓库,写出仓库进货方法。

3-3、超市有交易需向仓库拿货才能实现交易,写出根据货物名称和数量拿货方法。

3-4、仓库需要展示有什么货物,写出展示货物名称和数量方法。

4、超市:

4-1、写出根据用户买的货物计算总价钱的方法。

4-2、写出用户想使用哪种优惠的方法(简单工厂模式的实现)。

4-3、写出超市与顾客交互的方法(需要买什么、买多少、使用什么优惠)。

三、相关代码:

1、先创建产品父类:

        public ProductFather(string id, double price, string name)
        {
            this.ID = id;
            this.Price = price;
            this.Name = name;
        }
        public double Price { get; set; }
        public string Name { get; set; }
        public string ID { get; set; }

1-1、创建产品各个子类,继承于产品父类(这里不一一写):

    class Acer:ProductFather
    {
        public Acer(string id,double price,string name):base(id,price,name)
        {

        }
    }

2、抽象出计算价格父类,定义抽象获得总价方法:

    abstract class CalFather
    {
        public abstract double GetTotalMoney(double realMoney);
    }

2-1、创建计算价格无任何折扣子类,继承于计算价格父类,重写获得总价方法:

    class CalNormal : CalFather
    {
        public override double GetTotalMoney(double realMoney)
        {
            return  realMoney;
        }
    }

2-2、创建计算价格满减子类,继承于计算价格父类,重写获得总价方法:

    class CalMN : CalFather
    {
        public double M { get; set; }
        public double N { get; set; }
        public CalMN(double m,double n)
        {
            this.M = m;
            this.N = n;
        }
        public override double GetTotalMoney(double realMoney)
        {
            if (realMoney >= this.M)
            {
                return realMoney - (int)(realMoney / this.M) * this.N;
            }
            else
            {
                return realMoney;
            }
        }
    }

2-3、创建计算价格打折子类,继承于计算价格父类,重写获得总价方法:

    class CalRate : CalFather
    {
        //折扣率
        public double Rate { get; set; }
        public CalRate(double rate)
        {
            this.Rate = rate;
        }
        public override double GetTotalMoney(double realMoney)
        {
            return realMoney * this.Rate;
        }
    }

3、创建仓库类:

        //存储货物
        //List<SamSung> listSam = new List<SamSung>();
        //List<Acer> listAcer = new List<Acer>();
        //List<JiangYou> listJiangYou = new List<JiangYou>();
        //List<Banana> listBanana = new List<Banana>();
        //List<ProductFather> list = new List<ProductFather>();//全堆一起不好找

        List<List<ProductFather>> list = new List<List<ProductFather>>();

3-1、在创建仓库对象的时候,向仓库添加货架:

        //list[0]存储Acer电脑
        //list[1]存储三星手机
        //list[2]存储酱油
        //list[3]存储香蕉
        //在创建仓库对象的时候,向仓库添加货架
        public CangKu()
        {
            list.Add(new List<ProductFather>());
            list.Add(new List<ProductFather>());
            list.Add(new List<ProductFather>());
            list.Add(new List<ProductFather>());
        }

3-2、仓库进货方法:

        /// <summary>
        /// 进货
        /// </summary>
        /// <param name="strType"></param>
        /// <param name="count"></param>
        public void JinPros(string strType,int count)
        {
            for (int i = 0; i < count; i++)
            {
                switch (strType)
                {
                    case "Acer":list[0].Add(new Acer(Guid.NewGuid().ToString(),1000,"宏碁笔记本"));break;
                    case "SamSung":list[1].Add(new SamSung(Guid.NewGuid().ToString(), 2000, "棒之手机"));break;
                    case "JiangYou":list[2].Add(new JiangYou(Guid.NewGuid().ToString(), 10, "酱油"));break;
                    case "Banana":list[3].Add(new Banana(Guid.NewGuid().ToString(), 2, "香蕉"));break;
                }
            }
        }

3-3、超市向仓库取货方法:

        /// <summary>
        /// 取货
        /// </summary>
        /// <param name="strType"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public ProductFather[] QuPros(string strType,int count)
        {
            ProductFather[] pros = new ProductFather[count];
            for (int i = 0; i < count; i++)
            {
                switch (strType)
                {
                    case "Acer":
                        pros[i] = list[0][0];
                        list[0].RemoveAt(0); break;
                    case "SamSung":
                        pros[i] = list[1][0];
                        list[1].RemoveAt(0); break;
                    case "JiangYou":
                        pros[i] = list[2][0];
                        list[2].RemoveAt(0); break;
                    case "Banana":
                        pros[i] = list[3][0];
                        list[3].RemoveAt(0); break;
                }
            }
            return pros;
        }

3-4、展示货物方法:

        /// <summary>
        /// 展示货物
        /// </summary>
        public void ShowPros()
        {
            foreach (var item in list)
            {
                Console.WriteLine("我们超市有:" + item[0].Name + "," + "\t" + "有" + item.Count + "个," + "\t" + "每个" + item[0].Price + "元");
            }
        }

4、创建超市类:

        //创建仓库对象
        CangKu ck = new CangKu();

        //创建超市对象的时候,给仓库的货架上导入货物
        public SuperMarket()
        {
            ck.JinPros("Acer", 1000);
            ck.JinPros("SamSung", 1000);
            ck.JinPros("JiangYou", 1000);
            ck.JinPros("Banana", 1000);
        }

4-1、写出计算总价方法:

        /// <summary>
        /// 根据用户买的货物计算总价钱
        /// </summary>
        /// <param name="pros"></param>
        /// <returns></returns>
        public double GetMoney(ProductFather[] pros)
        {
            double realMoney = 0;
            for (int i = 0; i < pros.Length; i++)
            {
                realMoney += pros[i].Price;
            }
            return realMoney;
        }

4-2、写出顾客和服务员交互方法,模拟超市交易:

        /// <summary>
        /// 跟顾客交互的过程
        /// </summary>
        public void AskBuying()
        {
            Console.WriteLine("欢迎光临,请问您需要些什么");
            Console.WriteLine("我们有Acer/SamSung、JiangYou、Banana");
            string strType = Console.ReadLine();
            Console.WriteLine("您需要多少");
            int count = Convert.ToInt32(Console.ReadLine());
            //去仓库取货物
            ProductFather[] pros = ck.QuPros(strType, count);
            //下面该计算价钱了
            double realMoney = GetMoney(pros);
            Console.WriteLine("您总共应付{0}元",realMoney);
            Console.WriteLine("请选择您的打折方式 1--不打折 2--打9折 3--打8.5折 4--买300送50 5--满500送100");
            string input = Console.ReadLine();
            //通过简单工厂的设计模式,根据用户的选择获得一个打折对象
            CalFather cal = GetCal(input);
            double totalMoney = cal.GetTotalMoney(realMoney);
            Console.WriteLine("打完折后,您应付{0}元",totalMoney);
            Console.WriteLine("以下是您的购物信息");
            foreach (var item in pros)
            {
                Console.WriteLine("货物名称:"+item.Name+","+"\t"+"货物单价:"+item.Price+","+"\t"+"货物编号:"+item.ID);
            }
        }

4-3、简单工程模式实现,创建计算价格父类,写出根据情况具体实现哪种优惠方法:

        /// <summary>
        /// 根据用户的选择打折方式返回一个打折对象
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public CalFather GetCal(string input)
        {
            CalFather cal = null;
            switch (input)
            {
                case "1": cal = new CalNormal();break;//不参加任何优惠
                case "2": cal = new CalRate(0.9);break;//打9折
                case "3": cal = new CalRate(0.85);break;//打8.5折
                case "4": cal = new CalMN(300, 50);break;//满300减50
                case "5": cal = new CalMN(500, 100);break;//满500减100
            }
            return cal;
        }

5、调用超市类,实现超市收银系统:

            //创建超市对象
            SuperMarket sm = new SuperMarket();
            //展示货物
            sm.ShowPros();
            //跟用户交互
            sm.AskBuying();
            Console.ReadKey();

四、总结:

通过这个简单的小应用我们更加熟悉了简单工厂的设计模式,也更明显看出了它的优缺点,它更方便快捷实现功能的同时但也会因为其中一层出现问题就会整个系统瘫痪。

原文地址:https://www.cnblogs.com/jiechou/p/9061253.html

时间: 2024-10-10 05:41:30

C#设计模式——简单工厂模式实现:超市收银系统的相关文章

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns

c#练习之超市收银系统

类的设计 第一种类:商品的类,父类是个抽象类: 第二种类:折扣的类,父类也是个抽象类 类图如下: 使用技能 用继承抽象类实现多态,用多态来实现工厂模式: 使用反射机制来实现构造实例的多态和工厂模式; 工厂模式可以增加系统的可扩展性; 使用Dictionary中的list集合来减少代码量; 源代码 仓库类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste

超市收银系统和会员管理有什么区别?

目前,收银系统和会员管理是众多店铺运营和管理过程不可或缺的部分,那么,只能选一套符合超市的收银系统了,那么到底选收银系统还是会员系统呢?那么,咱们先来了解一下这两者的区别吧! 两者的共同点:其实会员系统不仅仅只是管理会员,会员系统中也带有收银功能,能帮助服装连锁店铺实现收银消费,管理日常店铺所有的业务需求.同样收银系统也是带会员管理功能的,只是功能比较弱点,也算是最基本的会员功能摆了. 两者的不同点:会员系统更多的是侧重于会员营销管理,进行会员活动深度营销,能帮助店铺进行各种营销活动,比如店庆.

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

C#设计模式——简单工厂模式

一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了?所有面向对象的编程都是在我们生活中存在的,从词义的解释就是我们生活中的工厂就是负责生产产品的,而到开发中对应的就是NEW不同的对象,该模式主要解决的问题就是解决创建对象与该类的解耦.设计原则中经常说的类单一职责.封装性都有体现.

php设计模式 — 简单工厂模式(静态工厂方法模式)

概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory) |又叫做  静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit) 配图 代码实例 直接将代码运行即可,