首页 > 其他分享 >设计模式(1) -- 创建模式

设计模式(1) -- 创建模式

时间:2023-10-23 10:03:06浏览次数:30  
标签:Carnivore Herbivore AnimalWorld -- 创建 public new 设计模式 class

创建模式

  1. 一种封装创建对象的模式它包括:
  2. 抽象工厂模式(Abstract Factory)
  3. 构造者模式(Builder)
  4. 工厂方法(Factory Method)
  5. 原型对象(Prototype)
  6. 单例模式(Singleton)

Abstract Factory

提供一个接口,用于创建一组相关或依赖的对象而无需指定它们的具体类型。

从关键字"一组相关或依赖的对象"可知:

  • 工厂要创建多个对象
  • 创建的对象们是相互关联或相互依赖的

实例--动物世界

模拟食物链

class AnimalWorld
{
  private Herbivore _herbivore;
  private Carnivore _carnivore;
  // Constructor
  public AnimalWorld(AnimalFactory factory)
   {
       _carnivore = factory.CreateCarnivore();
       _herbivore = factory.CreateHerbivore();
   }
    public void RunFoodChain()
    {
        _carnivore.Eat(_herbivore);
    }
}
  • AnimalWorld就是我们的客户端,客户端的代码不能被轻易改变。
  • AnimalWorld中Carnivore(食肉动物)吃Herbivore(食草动物)
  • 构造AnimalWorld需要提供AnimalFactory对象
  • AnimalFactory负责创建_herbivore和_carnivore

AnimalFactory就是抽象工厂类,它负责创建一组对象(_herbivore和_carnivore),并且_herbivore和_carnivore具有一定的依赖性(_carnivore.Eat(_herbivore)).

食肉动物吃食草动物 (抽象)

abstract class Herbivore
{
}

abstract class Carnivore
{
    public abstract void Eat(Herbivore h);
}

abstract class AnimalFactory
{
    public abstract Herbivore CreateHerbivore();
    public abstract Carnivore CreateCarnivore();
}

狮子吃角马(实现)

class Wildebeest: Herbivore
{
}

class Lion: Carnivore
{
    public void Eat(Herbivore h)
    {
        Console.WriteLine(this.GetType().Name +
              " eats " + h.GetType().Name);
    }
}

class WildebeestLionFactory: AnimalFactory
{
    public Herbivore CreateHerbivore()
    {
        return new Wildebeest();
    }
    public Carnivore CreateCarnivore()
    {
        return new Lion();
    }
}

狼吃野牛(实现)

class Bison: Herbivore
{
}

class Wolf : Carnivore
{
    public void Eat(Herbivore h)
    {
        Console.WriteLine(this.GetType().Name +
              " eats " + h.GetType().Name);
    }
}

class BisonWolfFactory: AnimalFactory
{
    public Herbivore CreateHerbivore()
    {
        return new Bison();
    }
    public Carnivore CreateCarnivore()
    {
        return new Wolf();
    }
}

测试程序

class MainApp
{
    public static void Main()
    {
        // Create and run the WildebeestLionFactory animal world
        ContinentFactory africa = new WildebeestLionFactory();
        AnimalWorld world = new AnimalWorld(africa);
        world.RunFoodChain();
        
         // Create and run the BisonWolfFactory animal world
        ContinentFactory america = new BisonWolfFactory();
        world = new AnimalWorld(america);
        world.RunFoodChain();
        
        Console.ReadKey();
     }
}

用WildebeestLionFactory和BisonWolfFactory创建了两个AnimalWorld,在上面的代码中我们甚至都不需要知道Wildebeest,Lion , Bison 和 Wolf的实现。

未完待续...


标签:Carnivore,Herbivore,AnimalWorld,--,创建,public,new,设计模式,class
From: https://blog.51cto.com/u_12072082/7983274

相关文章

  • 如何查看SSL证书是OV还是DV?
    网站的安全性与信任度对于用户来说至关重要,它决定着用户是否继续浏览以及是否与您开展业务。SSL证书则是确保网站能够通过HTTPS加密安全传输数据的基础,可确保网站的安全可信。部署了SSL证书的网站打开后,在浏览器地址栏处会有安全锁标志。而常见的SSL证书类型有OV、DV,那么,应该如何查......
  • 前端接口请求HTTP设置自定义header属性字段大小写问题
    问题:接口请求头传token值的字段为tokenValue,需要用到token的接口一直不能成功请求。后端排查发现没有接收到token,前端虽然传了token值,但是发现浏览器把tokenValue变成了Tokenvalue,导致后端没正确接收到token值。原因是:HTTPRFC里规定,大小写不敏感。HTTP/1.x大小写不敏感,但现实是......
  • 如何用金行化策略效析
    一、绩效分析功能特点1.专业分析引擎用高仿真清算模型,清算准确,处理效率高,完整重现交易场景2.可交互分析图表提供动态可交互的模型界面,让投资细节和全局一目了然3.分析全面绩效分析包含多指标、多模型,能够全面剖析交易特点和风格偏好4.模型经典实用根据多年量化实盘经验,精选各投资机......
  • CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?
    一、CyclicBarrier和CountDownLatch有什么区别?两者最核心的区别:CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程二、Semaphore(信号量)Sema......
  • 如何从C++Pytho:变的思维方
    有人说用Python编程很简单,6岁小孩都能学会。计算机视觉专家和编程语言爱好者asyaf刚开始上手Python时也这么想。但门槛低就仅意味着使用简单吗?经常调用API的人是不是一定比可以从零写出源码的人菜?在本文中,asyaf告诉我们,从C++转向Python,是一次「从个人到社区」的思维......
  • 信创办公--基于WPS的Word最佳实践系列(图片背景的删除)
    一、删除类型(1)类型一:图片本身的背景颜色模块比较多,背景比较复杂(2)类型二:图片的背景颜色是非常单一的,比方说都是白色或者都是黑色二、对应的删除方法对于类型一这种背景,我们可以直接采取图片工具当中的扣除背景这样的一个命令;这样WPS中内置的自动智能识别功能便会自动将图片抠图出来,......
  • 大模型:机器学习的崭新时代
    原创|文BFT机器人在机器学习领域,随着计算能力和数据规模的不断增长,大模型成为一种引人注目的技术。这些具有大规模参数和参数量的机器学习模型正在改变着我们对于人工智能的认识,大模型的出现使得机器学习模型能够处理更复杂的任务,取得更准确和复杂的预测结果。PART01大模型的概......
  • CAS自旋锁到底是什么?为什么能实现线程安全?
    ......
  • 使用mimipenguin实现从当前 Linux 用户转储登录密码
    另外,它还支持如:VSFTPd(活跃的FTP客户端连接)、Apache2(活跃的/旧的HTTP基础认证会话,但是这需要Gcore),还有openssh-server(活跃的SSH链接,需用sudo 命令)。重要的是,它逐渐被移植到其他语言中,以支持所有可想到的以后可以利用的情况。mimipenguin是如何工作的?要理解mimipengui......
  • rsync
    rsync目录rsync1.本地传输模式2.rsync常用选项说明3.以守护进程(socket)方式传输数据3.1服务端3.2客户端4.排除5.同步推送6.同步拉取7.inotify7.1inotifywait命令常用参数详解7.2客户端脚本7.3参数调整8.利用rsync清理大量小文件1.本地传输模式#把系统的hosts文件......