c#简单工厂、工厂方法与抽象工厂的区别分析

有一个比较好理解的例子,在这跟大家介绍下:
  1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
  2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
  3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
 1.简单工厂:


代码如下:

using System;
public interface ICar
{
    void run();
}

public class BMWCar : ICar
{
    public void run()
    {
        Console.WriteLine("BMWCar run");
    }
}

public class BenzCar : ICar
{
    public void run()
    {
        Console.WriteLine("BenzCar run");
    }
}

public class Driver
{
    public static ICar DriverCar(string carType)
    {
        switch (carType)
        {
            case "BMWCar": return new BMWCar();
            case "BenzCar": return new BenzCar();
            default: throw new Exception();
       }
    }
}

public class Client
{
    public static void Main()
    {
        ICar myCar = Driver.DriverCar("BenzCar");
        myCar.run();
        Console.Read();
    }
}

心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:


代码如下:

using System;
public interface ICar
{
    void run();
}

public class BMWCar : ICar
{
    public void run()
    {
        Console.WriteLine("BMWCar run");
    }
}

public class BenzCar : ICar
{
    public void run()
    {
        Console.WriteLine("BenzCar run");
    }
}
public abstract class Driver
{
    public abstract ICar DriverCar();
}

public class BMWDriver : Driver
{
    public override ICar  DriverCar()
    {
        return new BMWCar();
    }

}
public class BenzDriver : Driver
{
    public  override ICar DriverCar()
    {
        return new BenzCar();
    }
}

class Client
{
    public static void Main()
    {
        Driver myDriver = new BenzDriver();
        ICar myCar = myDriver.DriverCar();
        myCar.run();
        Console.Read();
    }
}

心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.

3.抽象工厂:


代码如下:

using System;

public interface IBusinessCar
{
    void run();
}

public interface ISportCar
{
void run();
}

public class BMWBusinessCar : IBusinessCar
{
    public void run()
    {
        Console.WriteLine("BMWCar run");
    }

}

public class BenzBusinessCar : IBusinessCar
{
    public void run()
    {
        Console.WriteLine("BenzBusinessCar run");
    }
}

public class BMWSportCar:ISportCar
{
public void run()
{
Console.WriteLine("BMWSportCar run");
}
}

public class BenzSportCar:ISportCar
{
public void run()
{

Console.WriteLine("BenzSportCar run");
}
}

public interface IDriver
{
IBusinessCar BusinessCarDriver();
ISportCar SportCarDriver();
}

public class BMWDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BMWBusinessCar();
}
public ISportCar SportCarDriver()
{
return new BMWSportCar();
}
}

public class BenzDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BenzBusinessCar();
}

public ISportCar SportCarDriver()
{
return new BenzSportCar();
}
}

class Client
{
    public static void Main()
    {
        IDriver myDriver =new BenzDriver();
        ISportCar myCar = myDriver.SportCarDriver();
        myCar.run();
        Console.Read();
    }

}

心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.

(0)

相关推荐

  • C++设计模式之抽象工厂模式

    问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足. 举个例子来说:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的:这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产

  • 初次接触php抽象工厂模式(Elgg)

    想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1. 活动类 Activity 复制代码 代码如下: class Activity extends ElggEntity { private $strategy; //用于保存策略实例 public function __construction($guid) { ... $this->load($guid); //载入实体 } public

  • PHP实现设计模式中的抽象工厂模式详解

    抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个 具体的工厂类. [意图] 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] [抽象工厂模式结构图] [抽象工厂模式中主要角色] 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类

  • javascript抽象工厂模式详细说明

    抽象工厂模式说明 1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭:对于设计有一定的问题.   2. 如何解决:就要用到抽象工厂模式,就是对功能类单独创建工厂类,这样就不必修改之前的代码,又扩展了功能.   3. 工厂模式其实就是对 实现同一接口的 实现类 的 统一 工厂方式创建调用,但 javascript 没有接口这号东西,所以就去掉这一层 实现,但位功能类的成员及方法都应当一样; 抽象工厂源码

  • java使用dom4j解析xml配置文件实现抽象工厂反射示例

    逻辑描述: 现在我们想在B层和D层加上接口层,并使用工厂.而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了. 配置文件:beans-config.xml.service-class与dao-class分别对应两个系列的产品.子菜单中id对应接口的命名空间,class对应实现类的命名空间. 复制代码 代码如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"

  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    本文实例讲述了Java设计模式之工厂模式.分享给大家供大家参考,具体如下: 一. 简单工厂 先来思考一个问题.我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建一个B实例,然后调用B实例的方法.这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需要使用C类来代替B类时,程序就不得不修改A类代码,如果应用中有100个或者10000个类以硬编码方式耦合了B类,则需要修改100个.10000个地方

  • Java设计模式之工厂方法和抽象工厂

    全网最详细的工厂设计模式,本文主要是创建型设计模式中的工厂方法和抽象工厂,先由传统实现方式引出问题,接着对代码改进到简单工厂,后扩展到工厂方法,最后是抽象工厂模式,文中包括概念理解和相关实现代码. 读者可以拉取完整代码本地学习,实现代码均测试通过上传到码云 一.引出问题 如果有一个客户老王,需要购买产品,产品分别是A.B.C. 如果用传统方法实现,分别定义A.B.C三个类,再分别创建他们所属的方法. 在客户对象中再分别调用他们的方法. Product ClientProduct(String o

  • c#简单工厂、工厂方法与抽象工厂的区别分析

    有一个比较好理解的例子,在这跟大家介绍下:   1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.   2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.   3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园. 所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同

  • Java工厂模式之简单工厂,工厂方法,抽象工厂模式详解

    目录 1.简单工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 2.工厂方法模式 1.定义 2.代码案例 3.适用场景 4.优缺点 3.抽象工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 4.总结 1.简单工厂模式 1.定义 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例.属于创建型模式,但它不属于GOF23种设计模式. 2.代码案例 假设以罐头产品的制造为案例 第一步:定义罐头的顶层接口类ICanned /**

  • Java中的抽象工厂模式_动力节点Java学院整理

    定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类.

  • 实例解析Java单例模式编程中对抽象工厂模式的运用

    定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别         抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同

  • Android编程设计模式之抽象工厂模式详解

    本文实例讲述了Android编程设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定都是具体的,也就是说每个工厂都会生产某一种具体的产品,那么抽象工厂意味着生产出来的产品是不确定的,那这岂不是很奇怪?抽象工厂模式起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现

  • 深入理解Java设计模式之抽象工厂模式

    目录 一.什么是抽象工厂模式 二.抽象工厂模式的应用场景 三.抽象工厂模式和工厂方法模式对比 四.抽象工厂模式的优缺点 五.抽象工厂模式的实现 六.总结 一.什么是抽象工厂模式 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式. 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象. 根据里氏替换原则,任

  • Java 超详细讲解设计模式之中的抽象工厂模式

    目录 抽象工厂模式 1.什么是抽象工厂 2.抽象工厂模式的优缺点 3.抽象工厂模式的结构与实现 4.抽象工厂方法模式代码实现 5.抽象工厂模式的应用场景 6.抽象工厂模式的扩展 抽象工厂模式 前面文章介绍的工厂方法模式中考虑的是一类产品的生产,比如案例中的百事可乐工厂只能生产百事可乐,可口可乐工厂只能生产可口可乐,也就是说:工厂方法模式只考虑生产同等级的产品. 1.什么是抽象工厂 在现实生活中许多工厂是综合型的工厂,能生产多种类)的产品,就拿案例里面的可乐来说,在节日的时候可能会有圣诞版的可乐,

  • Java设计模式之抽象工厂模式(Abstract Factory)

    作为工厂方法模式的孪生兄弟,相信大家对工厂方法模式和抽象工厂模式傻傻分不清楚吧. 那么,就让我来拯救大家吧! 抽象工厂模式 定义:所谓抽象工厂模式就是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现

随机推荐