C#实现工厂方法模式
作者:奋斗的大橙子 发布时间:2023-12-10 05:17:37
场景:简单工厂时候,我设计了一个场景,有三种剑去打怪,这时候,需求变化了,我三种剑变成了,匕首、剑以及木棒,想要用工厂方法来实现,怎么弄?
1.上文讲过简单工厂模式,它的最大优点在于工厂类内有创建类型的判断逻辑,客户端只需要通过动态的选择想要创建的类型,就可以交给工厂类来创建,去除了客户与具体产品之间的依赖。
缺点在于,当新建一个类型的时候,需要修正工厂类中的判断逻辑,添加一个case,此时就违背了开放-封闭原则。
2.工厂方法模式的引入:定义一个用于创建对象的接口,让子类觉得实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了它的子类。
客户端再使用工厂方法模式的时候,需要决定实例化哪一种工厂,选择判断的问题依然存在,也就是说工厂方法模式是对简单工厂的改进,把判断逻辑移动到了客户端。当加入新功能时候,原来是要修正工厂类,现在修改客户端就行了。
领悟:例如在进行编写一个计算器的时候。
①如果把所有的判断逻辑和类的创建放在一个类中,那么出现的问题是,新增加一个功能,其他的功能也会收到影响。所以引进了简单工厂模式,使得耦合性降低了。
②简单工厂在添加新功能的时候,需要改工厂类,同样违背开放-封闭原则,对更改是关闭的,对扩展是开放的。
③针对简单工厂又出现了工厂方法,这时候将工厂类进一步抽象为多个工厂类。这时候我添加一个新功能,就需要添加一个新的工厂类和一个具体的功能类。工作量也变大了。
Product:抽象产品
ConcreteProduct:具体产品
Factory:抽象工厂
ConcreteFactory:具体工厂
3.代码实现:
Weapon.cs
namespace FactoryMethod
{
public class Weapon
{
//设计一个怪兽,血量是100(其实并不是很合适,怪兽应该单独设计
//作为beat方法的参数传入
protected int monsterLife = 100;
public virtual void beat()
{
}
}
}
Knife.cs
namespace FactoryMethod
{
public class Knife : Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 20;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
Sword.cs
namespace FactoryMethod
{
public class Sword:Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 50;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
Stick.cs
namespace FactoryMethod
{
public class Stick:Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 100;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
IWeaponFactory.cs
namespace FactoryMethod
{
public interface IWeaponFactory
{
Weapon CreateWeapon();
}
}
KnifeFactory.cs
namespace FactoryMethod
{
public class KnifeFactory:IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Knife();
}
}
}
SwordFactory.cs
namespace FactoryMethod
{
public class SwordFactory : IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Sword();
}
}
}
StickFactory.cs
namespace FactoryMethod
{
public class StickFactory:IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Stick();
}
}
}
Program.cs
namespace FactoryMethod
{
class Program
{
static void Main(string[] args)
{
IWeaponFactory factory = new SwordFactory();
Weapon weapon = factory.CreateWeapon();
weapon.beat();
factory = new KnifeFactory();
weapon = factory.CreateWeapon();
weapon.beat();
factory = new StickFactory();
weapon = factory.CreateWeapon();
weapon.beat();
Console.ReadKey();
}
}
}
运行结果:
来源:https://www.cnblogs.com/dcz2015/p/5287347.html
猜你喜欢
- 第 1 步:将这个 Spring Boot 项目的打包方式设置为 war。<packaging>war</packagin
- java中的方法重载和方法重写有很多区别。 下面给出了方法重载和方法覆盖之间的差异列表:编号方法重载方法重写1方法重载用于提高程序的可读性。
- 引入为什么突然说一下Spring启动原理呢,因为之前面试的时候,回答的那可谓是坑坑洼洼,前前后后,补补贴贴。。。总而言之就是不行,再次看一下
- 大数据量操作的场景大致如下:数据迁移数据导出批量处理数据在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存
- ELK环境安装ELK是指Elasticsearch、Kibana、Logstash这三种服务搭建的日志收集系统,具体搭建方式可以参考《Spr
- 一、Mybatis1、mybatis-config.xml<?xml version="1.0" encoding
- 使用idea的file-》settings-》plugins安装maven helper插件失败,安装页面总是提示installed,在in
- 状态分类在Hibernate框架中,为了管理持久化类,Hibernate将其分为了三个状态:瞬时态(Transient Object)持久态
- 基于servlet+jsp+jdbc的后台管理系统,包含5个模块:汽车账户部管理、租车账户部管理、汽车信息管理表、租车记录表、租车租聘表。功
- 1 SharedPreferences 介绍SharedPreferences是使用键值对的方式来存储数据的SharedPreference
- 0、前言本文主要对几种常见Java序列化方式进行实现。包括Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Pro
- Java 静态绑定与动态绑定 最
- 1.Mybatis概述 MyBatis 是一款
- Unity脚本自动添加头部注释就是创建.cs文件时自动添加作者名,创建时间,文件名等看示例,我们在Unity的project面板下先创建一个
- 引言对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现、配置管理,非常好用的一个工具。然而这样的技术用的人越多面试被问的概
- Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问。 每一个用synchronized关键字声明的方法
- 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下代码如下:package com.x
- 前言应用系统需要通过Cache来缓存不经常改变得数据来提高系统性能和增加系统吞吐量,避免直接访问数据库等低速存储系统。缓存的数据通常存放在访
- 前言在讲这两种方式之前,我们先来说明一下什么是java中的jar文件jar (Java Archive File),翻译过来就是java的档
- Java Benchmark 基准测试的实例详解import java.util.Arrays; import java.util.conc