码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之工厂模式系列

时间:2020-10-06 20:40:10      阅读:26      评论:0      收藏:0      [点我收藏+]

标签:行修改   模式   switch   add   直接   product   需要   style   class   

    在开发中,工厂模式为我们提供了一种松耦合的形式,在一些需要频繁构造比较复杂的对象时,就可以使用工厂模式,通过对象工厂为我们提供实例,这样在后期维护的时候可以统一的对实例对象的过程进行管理升级。

    工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。

 

  简单工厂模式:

  先看一下代码:

static class SimpleFactoryPattern
{
    public static IProduct makeProduct(ProductClass pc)
    {
        //返回对应的实例
        switch (pc)
        {
            case ProductClass.one: return new ProductOne();
            case ProductClass.two: return new ProductTo();
        }
        throw new Exception("no this product");
    }
}
?
enum ProductClass
{
    one,
    two,
}
//将产品抽象
interface IProduct
{
    void Production();
}
?
class ProductOne : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}
?
class ProductTo : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

    简单工厂模式的代码逻辑比较容易理解,它的主要优点是:客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确,客户端无需知道所创建具体产品的类名,只需知道参数即可,但是它的缺点也显而易见:简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。

    因此,经过进一步发展,工厂方法模式出现了。

 

    工厂方法模式:

    工厂方法模式是对简单工厂模式的进一步抽象化。它将工厂也部分抽象出来,对应的每个工厂只生产一个实例。用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程,对于新产品的创建,只需多写一个相应的工厂类,我们下面看一下实现代码:

interface IFactory
{
    IProduct makeProduct();
}
?
class FactoryMethodPatternOne : IFactory
{
    public IProduct makeProduct()
    {
        return new ProductOne();
    }
}
class FactoryMethodPatternTwo : IFactory
{
    public IProduct makeProduct()
    {
        return new ProductTo();
    }
}
?
interface IProduct
{
    void Production();
}
?
class ProductOne : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}
?
class ProductTo : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

    当然,这种逻辑,还是存在着问题,一个工厂只能生产一个类,增加了代码复杂度,而且难以理解,为了更好的完善工厂模式,后来又推出了新的工厂模式:抽象工厂模式。

 

    抽象工厂模式:

    抽象工厂将工厂彻底抽象出来,每个抽象工厂可以生产多种相互关联的对象,像华为生产不只生产手机,还生产电脑,平板。下面看一下代码:

interfaceIFactory
{
    IProduct makeCar();
    IProduct makeClothes();
}
?
class FactoryOne : IFactory
{
    public IProduct makeCar()
    {
       return new BYD();
    }
?
    public IProduct makeClothes()
    {
       return new Lining();
    }
}
?
interface IProduct
{
    void Production();
}
?
class Lining : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}
?
class BYD : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

   但是抽象工厂模式,半违背开发-封闭原则:

  • 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。

  • 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。

 

    这三个工厂模式,都有自己的应用场景,不必过于纠结其缺点,开发时最合适的就是最好的。

 

这是我的公众号二维码,获取最新文章,请关注此号

技术图片

设计模式之工厂模式系列

标签:行修改   模式   switch   add   直接   product   需要   style   class   

原文地址:https://www.cnblogs.com/charlesmvp/p/13772624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!