工厂模式之二 - 工厂方法(Factory Method)

工厂方法(Factory Method)模式又叫做多态性工厂(Polymorphic Factory)。

简单工厂模式的优缺点

优点:将类的创建逻辑从客户端移入工厂类。

缺点:对开-闭原则支持不够,如果有新类加入,必须修改工厂类的逻辑。

 

工厂方法克服了简单工厂模式的缺点,引入了多态性。

 

工厂方法和简单工厂的区别:

简单工厂模式的核心是一个具体类,工厂方法模式的核心是一个抽象类。

 下面我们来看一下工厂方法的具体实现,我们还是以画图程序为例子。

图形的代码结构和简单工厂类似,读者可以参看简单工厂的代码,分别是IShape接口, Circle, Rectangle, Triangle类。

区别在于:

我们新定义了一个工厂接口,如下:

 

namespace designpattern.cs.FactoryMethod
{
    public interface IShapeFactory
    {
        IShape Create();
    }
}

 

 这样,如果每增加一个新类,我们就增加一个工厂类,该工厂类实现工厂接口,如下:

 

namespace designpattern.cs.FactoryMethod
{
    public class CircleFactory:IShapeFactory
    {
        public IShape Create()
        {
            return new Circle();
        }
    }
}

namespace designpattern.cs.FactoryMethod
{
    public class RectangleFactory : IShapeFactory
    {
        public IShape Create()
        {
            return new Rectangle();
        }
    }
}

namespace designpattern.cs.FactoryMethod
{
    public class TriangleFactory : IShapeFactory
    {
        public IShape Create()
        {
            return new Triangle();
        }
    }
}

 

最后,在客户端中我们可以根据不同的工厂类来创建不同的业务类,如下:

 

using System;

namespace designpattern.cs.FactoryMethod
{
    public class ClientDemo1
    {
        static void Main(string[] args)
        {
            IShape shape1,shape2,shape3;
            IShapeFactory factory1,factory2,factory3;

            //draw circle
            factory1 = new CircleFactory();
            shape1 = factory1.Create();
            shape1.draw();
            shape1.erase();

            //draw rectangle
            factory2 = new RectangleFactory();
            shape2 = factory2.Create();
            shape2.draw();
            shape2.erase();

            //draw triangle
            factory3 = new TriangleFactory();
            shape3 = factory3.Create();
            shape3.draw();
            shape3.erase();
            
            Console.ReadLine();
        }
    }
}

 

总结:工厂方法更好地支持了“开-闭”原则: 对修改关闭,对增加开放。

         因此,每增加一个业务类,我们改变了以往修改工厂类逻辑的做法,因为在实际项目中,工厂类

 可能已经很复杂了,修改容易出错,引起连锁反应。因此,我们选择增加工厂类。

         在工厂方法中,业务类和工厂类一一对应,数量相等,而工厂类都实现某个抽象接口,具有统一的原型。

 

时间: 2024-10-03 10:43:31

工厂模式之二 - 工厂方法(Factory Method)的相关文章

工厂模式与抽象工厂模式小览(二)

一.文章来由 就等啦~~还记得工厂模式与抽象工厂模式小览(一)第一部吗?我们在第一部中,分别详细的描述了(1)简单工厂(2)工厂模式(3)抽象工厂模式,但是并没有描述他们之间的关系,也没有比较工厂模式和抽象工厂模式,这对难舍难分的好基友之间的异同点,这些工作我们在第二部中完成~ 二.工厂模式和简单工厂 话说十年前,有一个暴发户,他家有三辆汽车--Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他

工厂模式、简单工厂模式和抽象工厂模式有什么区别和联系?

问题描述 这三者主要区别和联系是什么?谁可以简单的说下? 解决方案 解决方案二: 解决方案三:有什么区别?解决方案四:简单工厂模式和工厂方法模式之对比1.简单工厂模式将选择权交给了工厂,根据客户端的选择条件动态实例化相关的类:工厂方法模式将选择权交给了客户端,客户端需要哪一个产品,只需要实例化其对应的具体工厂.2.工厂方法模式相对简单工厂模式复杂性增加,但灵活性更高了.3.工厂方法克服了简单工厂违背开放-封闭原则的缺点.4.两者都降低了客户端与具体类的耦合.5.工厂方法模式是简单工厂模式的进一步

轻松掌握Java工厂模式、抽象工厂模式_java

在面向对象编程的程序设计中,我们最常见的操作就是new对象,但在创建一个新对象的过程中,会有一些问题,比如我们需要注意创建新对象的实现细节,初始化一些必要的参数等.这样会让我们在讲更多的心思放在对象的创建上,而不是程序逻辑的实现上,严重拖延了我们的程序开发效率.工厂模式和抽象工厂模式的出现则完美解决了这个问题,让我们不再关心对象的创建,更多的在重心放在业务的实现上. 特点:     1.程序员直接通过工厂方法创建对象,不再关注创建对象的细节.     2.隐藏对象的实现细节,也有利于程序的安全性

Java 设计模式之工厂方法(Factory Method)

类型: 对象创建型模式 意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类. Factory Method使一个类的实例化延迟到其子类. 适用性: 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候. 结构: 参与者: Product(Document) - 定义工厂方法所创建的对象的接口. • ConcreteProduct(MyDoc

工厂模式之三 - 抽象工厂(Abstract Factory)模式

抽象工厂(Abstract Factory)模式 不同于简单工厂和工厂方法,抽象工厂用于创建一个产品族, 即抽象工厂模式用于创建一系列类,这些类在业务上有关联. 我们来举个快餐店的例子. 场景:快餐店的套餐分为汉堡和饮料,汉堡可以选鸡肉汉堡,鱼肉汉堡,巨无霸等等,          饮料可以选咖啡,可乐,橙汁等等.   对于业务来说,汉堡和饮料分别可以被抽象为两类产品,因此,我们可以建立2个接口. 汉堡可以有2个方法,一个是打印汉堡名,一个是打印价钱,如下: namespace designpa

工厂模式-java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别

问题描述 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 解决方案 工厂实例就是这个工厂类的一个对象,跟普通实例对象没有什么区别的. 主要就是这个工厂实例的作用就是创建某种类型的对象的.即生产什么的工厂.

设计模式学习笔记(十)—Factory Method模式

<设计模式>一书对Factory Method模式是这样描述的: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 我的理解:FatoryMethod模式是一种创建型模式,定义一个用于创建对象的接口的意思是说,我们要定义一个用于创建对象的接口(或者说抽象类,实际上就是个抽象工厂abstractFactory),它的内部有一个创建对象的方法,这个方法的返回值是一个接口(或者抽象类)的类型,这个方法就是FactoryMethod:让子类

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的

设计模式(一)工厂模式Factory(创建型)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题