诗集鉴赏别有韵味——单例模式与工厂模式的浪漫邂逅

原文节选,出自两汉乐府诗集的《陌上桑》

日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。行者见罗敷,下担捋髭须。少年见罗敷,脱帽著帩头。耕者忘其犁,锄者忘其锄。来归相怨怒,但坐观罗敷。(喜蚕桑 译作:善蚕桑;相怨怒 译作:相怒怨)
使君从南来,五马立踟蹰。使君遣吏往,问是谁家姝?“秦氏有好女,自名为罗敷。”“罗敷年几何?”“二十尚不足,十五颇有余”。使君谢罗敷:“宁可共载不?”罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”
“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋。坐中数千人,皆言夫婿殊。”(白晰 译作:白皙)

罗敷

通过上面诗集分析,展现了古人对美女的欣赏标准。

今天我们使用 C# 程序重温鉴赏一次,分析主角 罗敷 的描写:

  • 外貌描写:
头发:“头上倭堕髻”,形容罗敷的发型优美,倭堕髻是一种流行的发髻样式。
耳朵:“耳中明月珠”,佩戴珍贵的明珠,显示其高贵和美丽。
服饰:“缃绮为下裙,紫绮为上襦”,穿着华丽的丝绸衣服,颜色搭配得体,显示出她的高雅和精致。
  • 气质描写:
勤劳:“罗敷善蚕桑,采桑城南隅”,罗敷不仅美丽,还勤劳能干,善于蚕桑。
端庄:尽管她美丽动人,但行为举止端庄大方,没有轻浮之态。
  • 社会影响:
行者见罗敷,下担捋髭须:路人见到罗敷,放下担子,捋着胡须欣赏,表现出她的魅力之大。
少年见罗敷,脱帽著帩头:年轻男子见到罗敷,脱下帽子,整理衣冠,表现出对她的倾慕。
耕者忘其犁,锄者忘其锄:农夫们见到罗敷,忘记了手中的农活,表现出她的美貌令人陶醉。

有意思的是 “社会影响”,通过分析我们采用 C# 语言的 工厂模式 结合 单例模式 来分别 “鉴赏” 诗歌之美:

说明:下面的分析纯属虚构,配合剧本(C#)设计而已,英雄所见略同…略同… 😃

此处主要是为了演示 工厂方法模式FactoryMethod,即一般工厂模式)的应用案例。

FactoryMethod

程序实现的总体概述:

- Constructor 
  - SingletonConstructorByLazy,泛型单利构造器
- Factory
  - ICreator ,工厂定义
  - ConcreteCreator ,基于 ICreator 规范的具体工厂
- Protagonist
  - ILuoFu,规范定义
  - LuoFu,主角罗敷实现 ILuoFu
  - Adorer,配角实现 ILuoFu ,代表官吏史君和夫婿
- PasserBys
  - IPasserBy,观众的定义
  - 基于 IPasserBy 标准的具体实现,XingZhe(行者),ShaoNian(少年),GenZhe(耕者),ChuZhe(锄者)

1、首先我们把这些人物类型抽象定义

  • 围绕主角 罗敷 相关人物的定义
internal interface ILuoFu
{
    /// <summary>
    /// 个人简介
    /// </summary>
    /// <param name="str"></param>
    void Profile(string str);

    /// <summary>
    /// 会话
    /// </summary>
    /// <param name="str"></param>
    void Say(string str);
}
  • 主角 罗敷 的具体实现
internal sealed class LuoFu : SingletonConstructorByLazy<LuoFu>, ILuoFu
{
    public bool IsCaiSang { get; private set; } 

    public void SetIsCaiSang(bool isCaiSang)
    {
        IsCaiSang = isCaiSang;
    }

    #region ILuoFu
    public void Profile(string str) => Console.WriteLine(str);

    public void Say(string str) => Console.WriteLine(str);
    #endregion
}
  • 配角具体实现
using ConsoleApp2.Constructor;

namespace ConsoleApp2.Protagonist;

internal sealed class Adorer : SingletonConstructorByLazy<Adorer>, ILuoFu
{
    #region ILuoFu
    public void Profile(string str) => Console.WriteLine(str);
    public void Say(string str) => Console.WriteLine(str);
    #endregion
}

2、创建泛型单例构造器

namespace ConsoleApp2.Constructor;

internal abstract class SingletonConstructorByLazy<TSingle> where TSingle : class, new()
{
    /// <summary>
    /// 加了Lazy之后,只有当使用到的时候才加载
    /// </summary>
    private static Lazy<TSingle> Single => new(() => new TSingle());
    public static TSingle SingleInstance => Single.Value;
}

3、 观众定义和实现

# 3.1 观众定义
using ConsoleApp2.Protagonist;

namespace ConsoleApp2.PasserBys;

internal interface IPasserBy
{
    /// <summary>
    /// 人员类型
    /// </summary>
    public string PasserType { get; }
    /// <summary>
    /// 看见罗敷的行为表现
    /// </summary>
    /// <param name="luoFu"></param>
    public void Comport(LuoFu luoFu);
}

# 3.1 观众实现,均继承泛型单例构造器并实现 IPasserBy
# 包括:XingZhe(行者),ShaoNian(少年),GenZhe(耕者),ChuZhe(锄者)

internal sealed class XingZhe : SingletonConstructorByLazy<XingZhe>, IPasserBy
{
    public string PasserType => "行者";

    public void Comport(LuoFu luoFu)
    {
        if (luoFu.IsCaiSang)
            Console.WriteLine("下担捋髭须。");
    }
}
---
internal sealed class ShaoNian : SingletonConstructorByLazy<ShaoNian>, IPasserBy
{
    public string PasserType => "少年";

    public void Comport(LuoFu luoFu)
    {
        if (luoFu.IsCaiSang)
            Console.WriteLine("脱帽著帩头。");
    }
}
---
internal sealed class GenZhe : SingletonConstructorByLazy<GenZhe>, IPasserBy
{
    public string PasserType => "耕者";

    public void Comport(LuoFu luoFu)
    {
        if (luoFu.IsCaiSang)
            Console.WriteLine("忘其犁");
    }
}
---
internal sealed class ChuZhe : SingletonConstructorByLazy<ChuZhe>, IPasserBy
{
    public string PasserType => "锄者";

    public void Comport(LuoFu luoFu)
    {
        if (luoFu.IsCaiSang)
            Console.WriteLine("忘其锄");
    }
}

4、创建一个工厂(Factory)

# 工厂规范定义
using ConsoleApp2.PasserBys;

namespace ConsoleApp2.Factory;

internal interface ICreator
{
    public IPasserBy CreatePasserBy<TClass>() where TClass : IPasserBy;
}

# 工厂规范实现
internal sealed class ConcreteCreator : SingletonConstructorByLazy<ConcreteCreator>, ICreator
{
    public IPasserBy CreatePasserBy<TClass>() where TClass : IPasserBy
    {
        //IPasserBy passerBy = default!;
        var tName = typeof(TClass).Name;
        IPasserBy passerBy = tName switch
        {
            nameof(XingZhe) => XingZhe.SingleInstance,
            nameof(ShaoNian) => ShaoNian.SingleInstance,
            nameof(GenZhe) => GenZhe.SingleInstance,
            nameof(ChuZhe) => ChuZhe.SingleInstance,
            _ => throw new NotImplementedException($"{tName} 类型暂未实现!")
        };

        return passerBy;
    }
}

5、应用单例模式和工厂模式,解析诗歌集

Program.cs 中,我们这样应用。

using ConsoleApp2.Factory;
using ConsoleApp2.PasserBys;
using ConsoleApp2.Protagonist;

namespace ConsoleApp2;

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("======欢迎来到 C# 诗歌集赏析大会======");

        Console.WriteLine("1.主角入场:");
        var luoFu = LuoFu.SingleInstance;
        // 1. 初始化罗敷采桑于
        luoFu.SetIsCaiSang(true);
        // 2. 罗敷简介
        string lufuInfo = "日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。";
        luoFu.Profile(lufuInfo);

        Console.WriteLine("2.观众入场:");
        // 单例方式
        //IPasserBy xinzhe = XingZhe.SingleInstance;
        //xinzhe.Comport(luoFu);

        // 单例方式 & 工厂方式
        var concreteCreator = ConcreteCreator.SingleInstance;
        PasserFactory(concreteCreator, luoFu, XingZhe.SingleInstance);
        PasserFactory(concreteCreator, luoFu, ShaoNian.SingleInstance);
        PasserFactory(concreteCreator, luoFu, GenZhe.SingleInstance);
        PasserFactory(concreteCreator, luoFu, ChuZhe.SingleInstance);
        Console.WriteLine("来归相怨怒,但坐观罗敷。(喜蚕桑 一作:善蚕桑;相怨怒 一作:相怒怨)");

        Console.WriteLine("3.官吏入场:");
        // 普通方式
        var adorer = Adorer.SingleInstance;
        string shijunInfo = "使君从南来,五马立踟蹰。";
        adorer.Profile(shijunInfo);
        Console.WriteLine("使君遣吏往,问是谁家姝?");
        luoFu.Say("罗敷说:“秦氏有好女,自名为罗敷。”");
        Console.WriteLine("小吏说:“罗敷年几何?”");
        luoFu.Say("罗敷说:“二十尚不足,十五颇有余”");
        adorer.Say("使君谢罗敷:“宁可共载不?”");
        luoFu.Say("罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”");

        Console.WriteLine("4.夫婿入场:");
        string fuxuInfo = "“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋。坐中数千人,皆言夫婿殊。”(白晰 一作:白皙)";
        adorer.Profile(fuxuInfo);
        adorer.Say("夫婿说:“你个龟儿子,光天化日竟敢...”");

    }

    static void PasserFactory<TClass>(ConcreteCreator concreteCreator, LuoFu luoFu, TClass t) where TClass : IPasserBy
    {
        IPasserBy passerBy = concreteCreator.CreatePasserBy<TClass>();
        Console.Write($"===>{passerBy.PasserType}见罗敷,");
        passerBy.Comport(luoFu);
    }
}

运行程序,输出如下信息:

1.主角入场:
日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。 头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。
2.观众入场:
===>行者见罗敷,下担捋髭须。
===>少年见罗敷,脱帽著帩头。
===>耕者见罗敷,忘其犁
===>锄者见罗敷,忘其锄
来归相怨怒,但坐观罗敷。(喜蚕桑 一作:善蚕桑;相怨怒 一作:相怒怨)
3.官吏入场:
使君从南来,五马立踟蹰。
使君遣吏往,问是谁家姝?
罗敷说:“秦氏有好女,自名为罗敷。”
小吏说:“罗敷年几何?”
罗敷说:“二十尚不足,十五颇有余”
使君谢罗敷:“宁可共载不?”
罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”
4.夫婿入场:
“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余 。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋 。坐中数千人,皆言夫婿殊。”(白晰 一作:白皙)
夫婿说:“你个龟儿子,光天化日竟敢...”

再次说明,上面分析纯属个人观点,主要是带入 C# 语言领悟 OOP 的世界,但愿归来还是那个少年…

题《罗敷春晖》
    —— 汉代乐府《陌上桑》诗意

城南采桑春日暖,婉转歌声动四围。
头上倭堕髻如云,耳垂明珠光熠熠。
缃绮紫襦身段好,步履轻盈似仙妃。
少年心慕罗敷美,青丝明月映春晖。

行者驻足频回顾,少年含笑整衣冠。
耕者忘犁锄者立,皆为罗敷动心弦。
世间佳丽何其多,独爱罗敷情未央。
春风十里不如你,芳华绝代永难忘。

总结

《陌上桑》 通过对 罗敷 的外貌、气质和社会影响的描写,展现了汉代人们对美女的审美标准。不仅注重外貌的美丽,还强调内在的美德和气质,以及对周围人的吸引力。这种综合的审美观念在当时的社会中具有重要的地位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值