创建型模式-工厂方法模式(二)

目录

工厂方法模式描述

工厂方法模式存在的问题

解决方案

使用场景

优缺点对比

代码


工厂方法模式描述

工厂方法模式,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

工厂方法模式存在的问题

如果你老板,开发了一款出售灯饰的系统,最初设计的是只有一种灯,蓝色的灯,然后你把大部分的代码都写在了蓝灯类中,一段时间后,你的货物销量非常好,而且销售到了海外,海外客户希望你能出售红灯的产品,这对于公司来说,非常有利。但是此时的代码已经全部写在蓝灯类里面了,你是在蓝灯类里面,增加红灯的逻辑吗?这样修改量太大了,如果以后增加绿灯怎么办呢?

解决方案

工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符)。 不用担心,对象仍将通过new运算符创建,只是该运算符改在工厂方法中调用罢了。 工厂方法返回的对象通常被称作 “产品”。

使用场景

1.当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。

2.如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。

3.如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象,可使用工厂方法。

优缺点对比

优点缺点
你可以避免创建者和具体产品之间的紧密耦合应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中
单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护
开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型

其中简单工厂模式属于工厂模式,工厂模式保持了简单工厂模式的优点,而且克服了它的缺点。

图示表达

看起来很麻烦,其实记忆起来非常的简单。首先分2部分,抽象工厂和具体工厂,然后有几个抽象产品就有几个具体产品,他们是一 一对应的关系

代码

1.建立一个控制台程序,代码文件总览。可见上面说的缺点,就体现出来了,写了很多的子类,如果分不清结构,将是灾难性的代码。

2.抽象产品,Light类

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

namespace ConsoleApp3
{
    public abstract class Light    //建立抽象产品, abstract,不能实例化
    {
        public abstract void TurnOn();      //抽象产品有打开的方法,abstract,不能实现
        public abstract void TurnOff();     //抽象产品有关闭的方法,abstract,不能实现
    }
}

3.具体产品,BulbLight类

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

namespace ConsoleApp3
{
    public class BulbLight : Light       //灯泡的光,建立具体的产品,继承灯泡
    {
        public override void TurnOff()//实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("关闭");
        }

        public override void TurnOn() //实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("打开");
        }
    }
}

4.具体产品,TubeLight类

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

namespace ConsoleApp3
{
    public class TubeLight : Light      //灯的灯管,建立具体的产品,继承灯泡 
    {
        public override void TurnOff()  //实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("关闭");
        }

        public override void TurnOn()    //实现灯泡的功能,override重写继承的方法  
        {
            Console.WriteLine("打开");
        }
    }
}

5.抽象工厂,Creator类

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

namespace ConsoleApp3
{
    public abstract class Creator     //建立抽象工厂, abstract,不能实例化
    {
        public abstract Light factory();      //建立Light产品抽象类,默认方法factory
    }
}

6.具体工厂,BulbCreator类

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

namespace ConsoleApp3
{
    public class BulbCreator : Creator //制造灯光的厂,具体工厂,继承工厂
    {
        public override Light factory()   //重写工厂的方法
        {
            return new BulbLight();    //返回制造灯泡的光
        }
    }
}

7.具体工厂,TubeCreator类

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

namespace ConsoleApp3
{
    public class TubeCreator : Creator //制造灯管的厂,具体工厂,继承工厂
    {
        public override Light factory()       //重写工厂的方法
        {
            return new TubeLight();        //返回制造灯管
        }
    }
}

8.使用

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Creator c1 = new BulbCreator();
            Creator c2 = new TubeCreator();
            Light l1 = c1.factory();
            Light l2 = c2.factory();
            l1.TurnOn();
            l1.TurnOff();
            new BulbCreator().factory().TurnOn();
            Console.WriteLine("-----------------");
            l2.TurnOn();
            l2.TurnOff();
            new TubeCreator().factory().TurnOn();
            Console.WriteLine("结束");
        }
    }
}

9.效果

来源:创建型模式-工厂方法模式(二)_故里2130的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

故里2130

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

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

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

打赏作者

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

抵扣说明:

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

余额充值