`
iwebcode
  • 浏览: 2045048 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

设计模式之-工厂方法模式

 
阅读更多

从简单工厂模式我们可以看出,在简单工厂模式中,增加新的产品类,是需要修改工厂类的,这不符合开放-封闭原则.而且在写工厂类的时候必须知道具体产品类的细节.也不符合由上相下的设计原则,如果要延后关注细节,则必须利用继承或者接口的技术来实现.将简单工厂模式中的工厂抽象,增加抽象工厂角色,这样用户,抽象工厂,抽象产品,用户就形成了最顶层的设计层面,具体的实现由具体的工厂来创建具体的产品.着就是工厂方法模式.

工厂方法模式角色:用户,抽象工厂,抽象产品,具体工厂,具体产品.

工厂方法模式采用一个具体工厂生产一种具体产品的方式进行产品的创建.用户具体要创建那种产品的选择逻辑推给了用户,用户通过选择不同的具体工厂来实现不同产品的创建选择.

工厂方法的优点:

1.符合开放封闭原则,因为增加新的产品不需要修改原来已有的工厂类,只需要增加相应的工厂即可.

2.将使用和创建的责任分开.

3.符合设计的先抽象后具体的顺序.

缺点:

1.如果产品类太多会导致增加很多的类,会使系统显得很不简洁.

2.如果将选择逻辑交给用户,则在一定程度上增加了用户对细节的依赖;

3.与简单工厂模式相比,增加了工厂本身的创建开销.

4.用户需要创建工厂类本身.(通过一定的方法可以将工厂类的创建委托给抽象类去完成.见例子.

抽象工厂方法是工厂方法更一般的表达,工厂方法可以针对产品族(如控件的Windows族控件,Unix族控件),如果只有一族产品(比如只有Windows族)则就退化成简单工厂方法(如果除掉抽象工厂,将工厂方法变为静态的方法,利用参数化减少工厂方法数量为1个,则就是简单工厂方法).)(一个工厂类,每个工厂方法创建一种产品).而如果只有一类产品(如只有Button控件),则退化成标准的工厂方法类似

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//变形的工厂方法
namespace MyBaseStudy
{

abstract class AbstractFactory
{
//这种方法也需用户创建工厂类。
public static AbstractProduct CreateProductM1(AbstractFactory bb)
{
return bb.CreateAProduct();
}
//利用模板方法将工厂类的创建委托给抽象工厂本身。
public static AbstractProduct CreateProductM2<T>() where T : AbstractFactory,new()
{
T factory = new T();
return factory.CreateAProduct();
}
public abstract AbstractProduct CreateAProduct();
}
abstract class AbstractProduct
{
public abstract double GetPrice();
public abstract void AddPrice(double p);
}

class ConcreteFactoryA : AbstractFactory
{
public override AbstractProduct CreateAProduct()
{
return new ConcreteProductA(100);
}
}

class ConcreteFactoryB : AbstractFactory
{
public override AbstractProduct CreateAProduct()
{
return new ConcreteProductB(200,0.9);
}
}
class ConcreteProductA : AbstractProduct
{
double _price;
public ConcreteProductA(double price)
{
this._price = price;

}
public override double GetPrice()
{
return this._price;
}
public override void AddPrice(double p)
{
this._price += p + 1;
}
}
class ConcreteProductB : AbstractProduct
{
double _price;
double _rate;
public ConcreteProductB(double price,double rate)
{
this._price = price;
this._rate = rate;
}
public override double GetPrice()
{
return this._price;
}
public override void AddPrice(double p)
{
this._price += p * this._rate;
}

}

class Client
{
public static void Test()
{
//方法1,一般的使用方法,用户需要自己创建工厂类,要创建产品A

AbstractFactory fa2 = new ConcreteFactoryA();
AbstractProduct pa2 = fa2.CreateAProduct();
System.Windows.Forms.MessageBox.Show(pa2.GetPrice().ToString());

//方法2,一般的使用方法,用户需要自己创建工厂类,要创建产品A,这种方法跟1比没什么优势,
//只是如果将CreateAProduct弄成保护类型,则可以隐藏创建细节,同时也可以起到一定代理模式的作用
AbstractFactory fa1 = new ConcreteFactoryA();
AbstractProduct pa1 = AbstractFactory.CreateProductM1(fa1);
System.Windows.Forms.MessageBox.Show(pa1.GetPrice().ToString());

//方法3,使用泛型方法方法,用户不需要自己创建工厂类,创建产品B,但这种方法的局限是工厂类必须具有不需要参数化的构造函数。
AbstractProduct pb = AbstractFactory.CreateProductM2<ConcreteFactoryB>();
System.Windows.Forms.MessageBox.Show(pb.GetPrice().ToString());

}
}
}
工厂方法和简单工厂一样,如果产品类太多都会导致具体的工厂类或方法过多,改进的办法是利用泛型,当然也可以利用反射,而且利用反射还可以进行参数化构造,但不利的地方是这同样会导致用户对构造细节的依赖.hibernate的构造方式其实就是这种方式,他将用户对构造细节的依赖转换成了可以动态配置的文件形式,而不是直接依赖.采用这种方式还有的好处就是工厂可以创造多种产品.但这种方式的一个缺点是需要采用动态参数构造目标产品的时候,这种方式就很难办到了.

分享到:
评论

相关推荐

    NET设计模式--工厂方法例子源码

    NET设计模式--工厂方法例子源码

    设计模式之-工厂方法-FactoryMethod

    《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...

    c++设计模式-工厂方法模式

    在标题“c++设计模式-工厂方法模式”中,我们关注的是如何在C++中实现工厂方法这一设计模式。工厂方法模式的核心思想是定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使类的实例化过程...

    我讲设计模式--工厂方法

    标题"我讲设计模式--工厂方法"暗示我们将深入探讨工厂方法的设计模式及其应用。这篇博文可能涉及了该模式的基本概念、工作原理以及实际场景下的使用示例。遗憾的是,由于没有直接提供博客的具体内容,我将基于工厂...

    设计模式-工厂方法模式

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    创建型设计模式---工厂设计模式实现

    创建型设计模式---工厂设计模式实现

    iOS设计模式-工厂方法

    **工厂方法设计模式** 在iOS开发中,设计模式是一种被广泛采用的最佳实践,它提供了一种在不指定具体实现的情况下创建对象的方式。工厂方法(Factory Method)是面向对象设计模式中的一种,属于创建型模式。它定义...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。 - 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示...

    设计模式-工厂方法模式视频

    工厂方法模式是面向对象设计中的一种经典设计模式,属于创建型模式。在软件工程中,当我们需要创建一系列相关或相互依赖的对象时,而不希望指定具体的类,工厂方法模式提供了一个很好的解决方案。 工厂方法模式的...

    java设计模式--工厂模式

    Java设计模式中的工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式的核心思想是将对象的创建过程封装起来,使得创建过程独立于使用过程,从而提高了代码的可扩展性和可维护性。在HeadFirst...

    设计模式--工厂模式java例子

    设计模式是软件开发中的一种最佳实践,用于解决常见的...总的来说,工厂模式是Java编程中常用的设计模式之一,尤其适用于需要根据条件创建不同对象的情况。理解并熟练应用工厂模式,能够提高代码的可维护性和可扩展性。

    设计模式----工厂模式

    工厂模式是面向对象设计中最为人熟知的设计模式之一,属于创建型模式,其主要目标是封装对象的创建过程,使得客户端无需关心对象的具体创建细节,只需通过工厂接口来获取所需的对象。 ### 1. 工厂模式的基本概念 ...

    JAVA设计模式例程-工厂模式-1

    这个名为"JAVA设计模式例程-工厂模式-1"的压缩包文件提供了一个关于工厂模式的实例,可以帮助学习者更好地理解和应用这个模式。 工厂模式的核心思想是提供一个创建对象的接口,但让实现延迟到子类去做,这样做的...

    优秀的设计模式示例-工厂模式

    工厂模式是设计模式中的一种,属于创建型模式,它提供了一种封装对象创建过程的方法,使得创建对象的过程与使用对象的代码分离,从而提高了代码的灵活性和可扩展性。 工厂模式的核心思想是通过一个工厂类来负责创建...

    设计模式-工厂方法代码

    在给定的“设计模式-工厂方法代码”文件中,我们可以深入探讨工厂方法这一特定的设计模式,以及它在Java编程中的应用。 工厂方法(Factory Method)是创建型设计模式之一,属于行为模式。它的主要作用是定义一个...

    设计模式UML图--工厂模式

    在给定的“设计模式UML图--工厂模式”中,我们关注的是三种不同的工厂模式:简单工厂、工厂方法和抽象工厂。这些模式都是创建型设计模式,它们的核心目标是为对象的创建提供一种抽象,使得客户端代码不必关心具体的...

    java设计模式----抽象工厂模式

    java设计模式----抽象工厂模式,简单工厂模式代码 代码内部

Global site tag (gtag.js) - Google Analytics