菜鸟学习设计模式——简单工厂

本文介绍了使用简单工厂模式实现吉他小店系统的案例。通过C#代码展示了如何根据不同的乐器规格搜索库存,并利用函数重载实现动态参数的选择。

这段时间以来,作为一名学生的我,一直在学习设计模式。从最初的百度百科,到现在应用其中的设计模式大概有一个多月吧。作为菜鸟的我感觉,设计模式确实可以让系统更加优化,在学习的初期,一直想利用所学在自己的软件中运用,从而出现了很多问题。现在的话,看了很多介绍设计模式的书记之后觉得,设计模式就是在你觉得你的系统通过利用一定的模式之后可以比以前更加好(菜鸟的想法哈!)。下面是最近老师不值得一个作业——吉他小店的代码(C#)。其中所涉及到的是简单工厂模式,不过有所改动就是在选择实现的时候,并不是通过一般的if 或者switch来选择,而是通过函数重载的形式来实现的。不知道这算不算解决了如何实现动态参数的问题哈。

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


namespace homework_3
{
    class Program
    {


        static void Main(string[] args)
        {
            //调用初始化函数,设置乐器存储数组
            Inventory inventory =SetArrayList();


            //设置想要查找乐器的规格
            Spec guitarSpec = InstrumentFactory.GetSpec(Builder.FENDER, "Stratocastor", Type.ELECTRIC, 3, Wood.ALDER, Wood.ALDER);
            Spec pianoSpec = InstrumentFactory.GetSpec(PianoBuilder.HAILUN, PianoType.Electric_Piano);
            Spec diziSpec = InstrumentFactory.GetSpec(Length.M_LONG);


            //查找类似规格的该乐器型号,并保存 ,(暂时选择pianoSpec,读者可选择guitarSpec尝试)
            ArrayList FindInstrumentList = inventory.Search(guitarSpec);


            //判断查找结果,如果存在该乐器则输出型号与价格
            if (FindInstrumentList.Count != 0)
            {
                foreach (Instrument instrcument in FindInstrumentList)
                {
                    //输出乐器的信息
                    instrcument.Show();
                }
            }
            else
            {
                Console.WriteLine("Sorry,we have nothing for you !");
            }
            Console.Read();
        }


        //乐器存储数组 初始化函数
        static Inventory SetArrayList()
        {
            //初始化存储数组
            Inventory inventory = new Inventory();


            //设置某类型乐器的规格(吉他)
            Spec guitarSpec = InstrumentFactory.GetSpec( Builder.FENDER, "Stratocastor", Type.ELECTRIC, 3, Wood.ALDER, Wood.ALDER);
            
            //添加该规格的乐器相关信息(吉他)
            inventory.addInstrument("a23", 123, guitarSpec);


            //设置某类型乐器的规格(钢琴)
            Spec pianoSpec = InstrumentFactory.GetSpec(PianoBuilder.HAILUN, PianoType.Electric_Piano);


            //添加该规格的乐器相关信息(吉他)
            inventory.addInstrument("a25", 1432, pianoSpec);
            inventory.addInstrument("b23", 1432, pianoSpec);


            Spec diziSpec = InstrumentFactory.GetSpec(Length.M_LONG);
            inventory.addInstrument("b32", 1432, diziSpec);


            //返回初始化结果
            return inventory;
        }


    }
}

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


namespace homework_3
{
    class InstrumentFactory
    {
        public static Spec GetSpec(  Builder builder,string model,
                                         Type type, int numString, Wood backWood, Wood topWood)
        {
            return new GuitarSpec(builder, model, type, numString, backWood, topWood);
        }


        public static Spec GetSpec(PianoBuilder pianoBuilder, PianoType pianoType)
        {
            return new PianoSpec(pianoBuilder, pianoType);
        }




        public static Spec GetSpec(Length length)
        {
            return new diziSpec(length);
        }
    }
}

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


namespace homework_3
{
    class Inventory
    {
        //乐器存储数组
        private ArrayList Instruments = new ArrayList();


        //增加乐器
        public void addInstrument(string serialNumber, double price, Spec instrument)
        {
            Instrument Instrument = new Instrument(serialNumber, price, instrument);


            Instruments.Add(Instrument);
        }


        //根据乐器的序列号获取相应乐器
        public Instrument getInstrument(string serialNumber)
        {
            foreach (Instrument Instrument in Instruments)
            {
                if (Instrument.SerialNumber.Equals(serialNumber))
                {
                    return Instrument;
                }
            }
            return null;
        }


        //根据乐器的规格查找类似的乐器,并返回
        public ArrayList Search(Spec searchInstrument)
        {
            //保存相似的乐器
            ArrayList matchingInstruments = new ArrayList();


            //遍历所有的乐器
            foreach (Instrument Instrument in Instruments)
            {
                
                //判断存储乐器的类型是否与想要查找的乐器类型相似
                if (Instrument.Spec.GetType() == searchInstrument.GetType())
                {


                    //判断规格是否与想要查找规格相似(吉他)
                    if (searchInstrument.matches(Instrument.GetInstrumentSpec()))
                        matchingInstruments.Add(Instrument);
                }
            }
             
            //返回查找结果
            return matchingInstruments;
        }
    }
}

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


namespace homework_3
{
    //乐器类
    class Instrument
    {
        private string serialNumber;
        private double price;


        //乐器规格类
        private Spec spec;


        public Instrument(string serialNumber, double price, Spec Spec)
        {
            this.SerialNumber = serialNumber;
            this.Price = price;
            this.spec = Spec;
        }


        public string SerialNumber
        {
            set { serialNumber = value; }
            get { return serialNumber; }
        }


        public double Price
        {
            set { price = value; }
            get { return price; }
        }


        public Spec Spec
        {
            set { spec = value; }
            get { return spec; }
        }


        //返回该乐器
        public  Spec GetInstrumentSpec() { return spec; }


        //展示乐器的所有信息
        public   void Show()
        {
            Console.WriteLine(SerialNumber + "," + Price);
            spec.Show();
        }
    }
}

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


namespace homework_3
{
    //乐器类型


    //乐器规格
    class Spec
    {
        //判断俩个相同乐器的规格是否相同
        public virtual Boolean matches(Spec ISpec){ return false;}


        //返回该乐器的所有规格信息
        public virtual void  Show() {}
    }
}

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


namespace homework_3
{
    public enum Type
    {
        ACOUSTIC, ELECTRIC
    }


    public enum Builder
    {
        FENDER, MARTIN, GIBSON, COLLINGS, OLSON, RYAN, PRS, ANY
    }


    public enum Wood
    {
        INDIAN_ROSEWOOD, BRAZILIAN_ROSEWOOD, MAHOGANY, MAPLE,
        COCOBOLO, CEDAR, ADIRONDACK, ALDER, SITKA
    }


    class GuitarSpec:Spec
    {
        private string model;
        private Builder builder;
        private int numString;
        private Type type;
        private Wood backWood, topWood;


        //初始化函数
        public GuitarSpec(  Builder builder,string model,
                          Type type, int numString, Wood backWood, Wood topWood)
        {
           
            this.builder = builder;
            this.model = model;
            this.type = type;
            this.numString = numString;
            this.backWood = backWood;
            this.topWood = topWood;
        }


        public string Model()
        {
            return model;
        }


        public Builder Builder()
        {
             return builder; 
        }


        public int NumString()
        {
              return numString; 
        }


        public Type Type()
        {
             return type;
        }


        public Wood BackWood()
        {
             return backWood; 
        }


        public Wood TopWood()
        {
             return topWood; 
        }


        //判断吉他规格是否相同
        public override Boolean matches(Spec Spec)
        {
            GuitarSpec guitarSpec = (GuitarSpec)Spec;
            if (builder != guitarSpec.Builder())
            {
                return false;
            }


            if ((model != null) && !model.Equals("") && (!model.ToLower().Equals(guitarSpec.Model().ToLower())))
            {
                return false;
            }


            if (type != guitarSpec.Type())
            {
                return false;
            }


            if (numString != guitarSpec.NumString())
            {
                return false;
            }
            if (backWood != guitarSpec.BackWood())
            {
                return false;
            }


            if (topWood != guitarSpec.TopWood())
            {
                return false;
            }


            return true;
        }


        //返回吉他的所以规格信息
        public override  void  Show()
        {
            Console.WriteLine(  model.ToString() + "," + builder.ToString()+
                             numString.ToString() + type.ToString() + "," + backWood.ToString()+"," + topWood.ToString());
        }
    }
}


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


namespace homework_3
{
    public enum PianoType
    {
        CHILDREN_PIANO, Electric_Piano, Roll_up_Piano
    }


    public enum PianoBuilder
    {
        YAMAHA, PEARLRIVER, HAILUN, XINGHAI, KAWAI, SEJUNG
    }


    class PianoSpec:Spec
    {
        private PianoBuilder pianoBuilder;
        private PianoType pianoType;


        //初始化函数
        public PianoSpec( PianoBuilder pianoBuilder, PianoType pianoType)
        {
            this.pianoBuilder = pianoBuilder;
            this.pianoType = pianoType;
        }


        public PianoBuilder GetpianoBuilder()
        {
            return pianoBuilder;
        }


        public PianoType GetpianoType()
        {
            return pianoType;
        }


        //判断钢琴规格是否相同
        public override Boolean matches(Spec Spec)
        {
            PianoSpec pianoSpec = (PianoSpec)Spec;
            if (pianoBuilder != pianoSpec.pianoBuilder)
            {
                return false;
            }


            if (pianoType != pianoSpec.pianoType)
            {
                return false;
            }
            return true;
        }


        //返回钢琴的所以规格信息
        public override void  Show()
        {
            Console.WriteLine( pianoBuilder.ToString() + "," + pianoType.ToString());
        }
    }
}


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


namespace homework_3
{
    public enum Length
    {
         SHORT,LONG,M_LONG
    }
    class diziSpec:Spec
    {
        private Length length;
        public diziSpec( Length length)
        {
            this.length = length;
        }


        public Length Length()
        {
            return length;
        }


        public override Boolean matches(Spec Spec)
        {
            diziSpec diziSpec = (diziSpec)Spec;
            if (length != diziSpec.Length())
            {
                return false;
            }


            return true;
        }


        //返回吉他的所以规格信息
        public override void Show()
        {
            Console.WriteLine(length.ToString());
        }
    }
}

内容概要:本文是一份针对2025年中国企业品牌传播环境撰写的《全网媒体发稿白皮书》,聚焦企业媒体发稿的策略制定、渠道选择与效果评估难题。通过分析当前企业面临的资源分散、内容同质、效果难量化等核心痛点,系统性地介绍了新闻媒体、央媒、地方官媒和自媒体四大渠道的特点与适用场景,并深度融合“传声港”AI驱动的新媒体平台能力,提出“策略+工具+落地”的一体化解决方案。白皮书详细阐述了传声港在资源整合、AI智能匹配、舆情监测、合规审核及全链路效果追踪方面的技术优势,构建了涵盖曝光、互动、转化与品牌影响力的多维评估体系,并通过快消、科技、零售等行业的实战案例验证其有效性。最后,提出了按企业发展阶段和营销节点定制的媒体组合策略,强调本土化传播与政府关系协同的重要性,助力企业实现品牌声量与实际转化的双重增长。; 适合人群:企业市场部负责人、品牌方管理者、公关传播从业者及从事数字营销的相关人员,尤其适用于初创期至成熟期不同发展阶段的企业决策者。; 使用场景及目标:①帮助企业科学制定媒体发稿策略,优化预算分配;②解决渠道对接繁琐、投放不精准、效果不可衡量等问题;③指导企业在重大营销节点(如春节、双11)开展高效传播;④提升品牌权威性、区域渗透力与危机应对能力; 阅读建议:建议结合自身企业所处阶段和发展目标,参考文中提供的“传声港服务组合”与“预算分配建议”进行策略匹配,同时重视AI工具在投放、监测与优化中的实际应用,定期复盘数据以实现持续迭代。
先展示下效果 https://pan.quark.cn/s/987bb7a43dd9 VeighNa - By Traders, For Traders, AI-Powered. Want to read this in english ? Go here VeighNa是一套基于Python的开源量化交易系统开发框架,在开源社区持续不断的贡献下一步步成长为多功能量化交易平台,自发布以来已经积累了众多来自金融机构或相关领域的用户,包括私募基金、证券公司、期货公司等。 在使用VeighNa进行二次开发(策略、模块等)的过程中有任何疑问,请查看VeighNa项目文档,如果无法解决请前往官方社区论坛的【提问求助】板块寻求帮助,也欢迎在【经验分享】板块分享你的使用心得! 想要获取更多关于VeighNa的资讯信息? 请扫描下方二维码添加小助手加入【VeighNa社区交流微信群】: AI-Powered VeighNa发布十周年之际正式推出4.0版本,重磅新增面向AI量化策略的vnpy.alpha模块,为专业量化交易员提供一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案: :bar_chart: dataset:因子特征工程 * 专为ML算法训练优化设计,支持高效批量特征计算与处理 * 内置丰富的因子特征表达式计算引擎,实现快速一键生成训练数据 * Alpha 158:源于微软Qlib项目的股票市场特征集合,涵盖K线形态、价格趋势、时序波动等多维度量化因子 :bulb: model:预测模型训练 * 提供标准化的ML模型开发模板,大幅简化模型构建与训练流程 * 统一API接口设计,支持无缝切换不同算法进行性能对比测试 * 集成多种主流机器学习算法: * Lass...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值