设计模式-工厂模式

概述

工厂模式是一种创建对象的设计模式,主要的是将对象的创建和使用分离的一种方法,可以在不知道实现的情况下创建具体的对象,举个例子,比如一个工厂是做包装的,我不需要知道工厂内部是怎么实现的,我只需要传入产品,返回给我一个包装好的物品就行。工厂模式有三种变体,简单工厂模式,工厂方法模式,抽象工厂模式,如下。以下环境不是unity,是C#的控制台程序

需求:

有一个工厂做包装生意,现有苹果,香蕉,桃子,请将各个水果包装好运出来。


简单工厂模式

internal class Program
{
    private static void Main(string[] args)
    {
        IPack pack = FruitFactory.FactorPack("Peach");
        pack.PackFruit();
    }
}
public interface IPack//打包接口
{
    void PackFruit();
}
public class Apple : IPack//苹果
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Appple!");
    }
}
public class Banana : IPack//香蕉
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Banana!");
    }
}
public class Peach : IPack//桃子
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Peach!");
    }
}
public class FruitFactory//水果工厂
{
    public static IPack FactorPack(string type)
    {
        switch (type)
        {
            case "Appple":
                return new Apple();
            case "Banana":
                return new Banana();
            case "Peach":
                return new Peach();
            default:
                throw new Exception("无效类型");
        }
    }
}

输出结果:Pack Peach!

简单工厂:简单来说就是通过继承接口,实现各种类型的扩展,然后通过一个统一的工厂方法管理起来,但是修改的话需要修改工厂方法(如上FactorPack),不满足开闭原则

扩展的话需要加入新的类,然后在工厂方法中添加具体的类型。具体的实现可以放在对应的方法类,当然也可以带入参数,具体业务逻辑的扩展,按实际的需求来


工厂方法模式

internal class Program
{
    private static void Main(string[] args)
    {
        CreatorFactor pack = new PeachFactory();
        IPack peach = pack.FactoryMethod();
        peach.PackFruit();
    }
}
public interface IPack//打包接口
{
    void PackFruit();
}
public class Apple : IPack//苹果
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Appple!");
    }
}
public class Banana : IPack//香蕉
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Banana!");
    }
}
public class Peach : IPack//桃子
{
    public void PackFruit()
    {
        Console.WriteLine("Pack Peach!");
    }
}
public abstract class CreatorFactor//工厂抽象类
{
    public abstract IPack FactoryMethod();
}

public class AppleFactory : CreatorFactor//苹果工厂
{
    public override IPack FactoryMethod()
    {
        return new Apple();
    }
}
public class BananaFactory : CreatorFactor//香蕉工厂
{
    public override IPack FactoryMethod()
    {
        return new Banana();
    }
}
public class PeachFactory : CreatorFactor//桃子工厂
{
    public override IPack FactoryMethod()
    {
        return new Peach();
    }
}

输出结果:Pack Peach!

工厂方法模式:这个办法解决了上述的简单工厂的问题,不满足设计模式原则的开闭原则,工厂方法模式可以在不修改原来代码的情况下扩展新的工厂。简单来说,就是将工厂方法做成了一个抽象类,然后有新的工厂的时候继承自这个抽象类,实现对应的方法

扩展的话,只需要扩展新的类型,然后继承CreatorFactor再实现对应的方法,不用修改原来的方法,缺点就是增加了代码的复杂性,要管理很多的工厂。


抽象工厂模式

这里扩展一下复杂度,现在苹果,香蕉,桃子,现在有两种不同的包装,普通和精美

internal class Program
{
    private static void Main(string[] args)
    {
        IFactory factory = new PeachFactory();
        IOrdinaryPack ordinaryPack = factory.PackOridinary();
        IExquisitePack exquisitePack = factory.PackExquisite();
        ordinaryPack.PackOrdinaryFruit();
        exquisitePack.PackExquisiteFruit();
    }
}
public interface IOrdinaryPack//普通包装接口
{
    void PackOrdinaryFruit();//包装普通水果
}
public class OrdinaryApple : IOrdinaryPack//普通包装苹果
{
    public void PackOrdinaryFruit()
    {
        Console.WriteLine("Pack OrdinaryApple!");
    }
}
public class OrdinaryBanana : IOrdinaryPack//普通包装香蕉
{
    public void PackOrdinaryFruit()
    {
        Console.WriteLine("Pack OrdinaryBanana!");
    }
}
public class OrdinaryPeach : IOrdinaryPack//普通包装桃子
{
    public void PackOrdinaryFruit()
    {
        Console.WriteLine("Pack OrdinaryPeach!");
    }
}
//----------------------------------------------------------------------------
public interface IExquisitePack//精美包装接口
{
    void PackExquisiteFruit();//包装精美水果
}
public class ExquisiteApple : IExquisitePack//精美包装苹果
{
    public void PackExquisiteFruit()
    {
        Console.WriteLine("Pack ExquisiteApple!");
    }
}
public class ExquisiteBanana : IExquisitePack//精美包装香蕉
{
    public void PackExquisiteFruit()
    {
        Console.WriteLine("Pack ExquisiteBanana!");
    }
}
public class ExquisitePeach : IExquisitePack//精美包装桃子
{
    public void PackExquisiteFruit()
    {
        Console.WriteLine("Pack ExquisitePeach!");
    }
}
//----------------------------------------------------------------------------
public interface IFactory//工厂接口
{
    IOrdinaryPack PackOridinary();
    IExquisitePack PackExquisite();
}
public class AppleFactory : IFactory//苹果工厂
{
    public IExquisitePack PackExquisite()
    {
        return new ExquisiteApple();
    }

    public IOrdinaryPack PackOridinary()
    {
        return new OrdinaryApple();
    }
}
public class BananaFactory : IFactory//香蕉工厂
{
    public IExquisitePack PackExquisite()
    {
        return new ExquisiteBanana();
    }

    public IOrdinaryPack PackOridinary()
    {
        return new OrdinaryBanana();
    }
}
public class PeachFactory : IFactory//桃子工厂
{
    public IExquisitePack PackExquisite()
    {
        return new ExquisitePeach();
    }

    public IOrdinaryPack PackOridinary()
    {
        return new OrdinaryPeach();
    }
}

输出结果:

Pack OrdinaryPeach!
Pack ExquisitePeach!

抽象工厂模式:抽象工厂模式是工厂方法模式的一种扩展,仔细看两者相识度是很高的,各有各适用的场景,实际适用按照需求来

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值