`

AbstractFactoryPattern(二)

阅读更多

关于抽象工厂(Abstract Factory)模式,网上一个非常流行的例子,麦当劳和肯德基的故事。具体怎么说的我已经忘了,但是我想自己描述一遍,希望能让自己加深对设计模式思想的理解,也希望对大家有所帮助。

 

既然叫抽象工厂,那一定有工厂(废话)。那么我们可以认为麦当劳和肯德基就是生产食物的工厂,那么理所当然,汉堡和鸡腿是他们共同生产的两种食物,不管你去MDL还是KDJ,说:我要鸡腿,那肯定不会给你拿来烤羊腿。嘿嘿 。这里,我们假定麦当劳和肯德基只生产这两种产品(这很重要,因为抽象工厂模式的一个很重要的场景就是产品相对稳定,如果要经常新增新产品,那么需要和另外的设计模式混合使用或寻求其它解决方案,这里不赘述)。

   

情况已经很明显了,我们是消费者,我们就是客户,就是产品的消费者,就是程序中对象的调用者。而麦当劳和肯德基,理所当然的,他们就是工厂,一个叫做麦当劳工厂,一个叫做肯德基工厂,他们是真正的生产者,而对于我们这些客户消费者(程序中对象的调用者)来说,不管是去麦当劳还是肯德基,我们都说一样的话(我们的要求是稳定的):我要鸡腿。只要我们提出这个请求,那么肯定会得到我们想要的。而作为工厂(生产者),麦当劳和肯德基都生产鸡腿和汉堡,所以抽象出来的抽象工厂都具有生产鸡腿和生产汉堡的功能,这是接口中的两个方法。因为在这个接口中,还不知道到底要生产谁家的产品,所以只能返回个抽象的鸡腿或汉堡,等到麦当劳或者肯德基工厂生产出来,就知道是谁家的了。(有标志嘛,哈哈,这就是动态创建对象)

 不管是麦当劳还是肯德基的鸡腿或汉堡,它的本质都是鸡腿或汉堡,所以可以抽象出来。那么鸡腿就派生出麦当劳的鸡腿和肯德基的鸡腿,而汉堡就派生出麦当劳的汉堡和肯德基的汉堡。而对于我们这些客户消费者(程序中对象的调用者)来说,不管是去麦当劳还使肯德基,我们都说一样的话(我们的要求是稳定的):我要鸡腿。只要我们提出这个要求,那么肯定会得到我们想要的。不管是谁家的鸡腿,肯定是鸡腿不会是羊腿。所以,我们只要规定好是鸡腿(接口)就行了,而让工厂去绝对具体的制作过程。我们只伸手接过来一个鸡腿,狠狠的咬一口,恩,真香~:)

 

 到现在为止,我们只和鸡腿(抽象的接口)还有抽象工厂(因为我们不管是麦当劳还是肯德基,我们只要鸡腿)打交道。

     

当我们走向一个快餐店,这个过程就决定了我们到底要哪个工厂来生产鸡腿和汉堡。我们可以把我们消费的习惯存入大脑,每次出门直接取出来,就只管走就行了。也不用看到底是走向了哪里,反正最后吃了好多鸡腿和汉堡,饱饱的走了。:)哈哈   理论讲解完毕,那么现在看看UML图。

     那么,现在,大家应该已经看清楚。这张图是我自己随手画的,画完之后发现,哇,这不就是经典的AbstractFactory模式的那张图吗?现在,你了解吗?

        必胜客来了,也做汉堡和鸡腿。那么怎么办呢?非常容易,我们消费者根本不管这些,只管把必胜客加入我们的大脑(配置文件),需要的时候,直接走进去就行了。仅仅需要添加一个必胜客工厂,必胜客汉堡,必胜客鸡腿,OK,一切搞定。那么又有人问了,我要喝汽水怎么办呢?我偷偷告诉你,这里不卖~:)哈哈,希望大家学习愉快,工作愉快

附下面获取鸡腿于汉堡的价格:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{

//客户程序
    class Program
    {
        static void Main(string[] args)
        {
            App app = new App();
            double price=app.GetPrice(new MDLFactory());
            Console.WriteLine("price:" + price.ToString());
            Console.ReadLine();
        }
    }
    //主业务逻辑

    public class App
    {
        public double GetPrice(Factory factory)
        {
            drumstick dru = factory.Createdrumstick();
            hamburger ham = factory.Createhamburger();
            return dru.prices() + ham.prices();
        }
    }


    //抽象类
    #region
    //鸡腿
    public abstract class drumstick
    {
        public abstract double prices();//价格
    }
    //汉堡
    public abstract class hamburger
    {
        public abstract double prices();//价格
    }
    //生产鸡腿于汉堡
    public abstract class Factory
    {
        public abstract drumstick Createdrumstick();
        public abstract hamburger Createhamburger();
    }
    #endregion
    //抽象类
    //具体实现
    #region
    //KDJ鸡腿
    public class KDJdrumstick : drumstick
    {
        public override double prices()
        {
            return 6.00;
        }
    }
    //KDJ汉堡
    public class KDJhamburger : hamburger
    {
        public override double prices()
        {
            return 10;
        }
    }
    public class MDLdrumstick : drumstick
    {
        public override double prices()
        {
            return 7;
        }
    }
    public class MDLhamburger : hamburger
    {
        public override double prices()
        {
            return 11;
        }
    }
    public class KDJFactory : Factory
    {
        public override drumstick Createdrumstick()
        {
            return new KDJdrumstick();
        }
        public override hamburger Createhamburger()
        {
            return new KDJhamburger();
        }
    }
    public class MDLFactory : Factory
    {
        public override drumstick Createdrumstick()
        {
            return new MDLdrumstick();
        }

        public override hamburger Createhamburger()
        {
            return new MDLhamburger();
        }
    }
    #endregion
    //具体实现结束

}

 

 

  • 大小: 29.4 KB
分享到:
评论

相关推荐

    AbstractFactoryPattern

    **抽象工厂模式(Abstract Factory Pattern)** 抽象工厂模式是一种创建型设计模式,它提供一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式是工厂方法模式的升级版,不仅创建单个产品,而且可以创建一...

    AbstractFactoryPattern:抽象工厂设计模式的完整实现

    AbstractFactoryPattern抽象工厂指的是提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类如果多个类有相同的行为,但实际实现不同,则可能需要某种抽象类型作为其父类被继承,抽象类型定义了所有...

    AbstractFactoryPattern:抽象工厂模式的实现

    在`AbstractFactoryPattern-master`这个压缩包中,可能包含了示例代码,展示了如何在Java中实现抽象工厂模式。通常,你可以找到以下几个部分: - `AbstractFactory.java`:抽象工厂接口。 - `ConcreteFactory1.java`...

    常用设计模式的IOS实现源码打包下载

    AbstractFactoryPattern AdapterPattern IBridgePattern IBuilderPattern ChainOfResponsibilityPatte 日CommandPattern ICompositePattern IDecoratorPattern FacadePattern IFactoryPattern FlyweightPattern ...

    design pattern

    包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式(AbstractFactoryPattern)、观察...

    简单工厂模式和工厂方法模式

    在C++编程中,我们可以看到`AbstractFactoryPattern.cpp`和`AbstractFactoryPattern.h`这两个文件,这通常表示实现了一个抽象工厂模式。抽象工厂模式是工厂方法模式的一个扩展,它提供一个创建一系列相关或相互依赖...

    [原创][创建型模式] 简单工厂、工厂方法、抽象工厂三种设计模式的理解

    比如,`AbstractFactoryPattern.cpp`和`AbstractFactoryPattern.h`可能包含以下代码: ```cpp class AbstractFactory { public: virtual std::unique_ptr<ProductA> createProductA() = 0; virtual std::...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    抽象工厂模式(abstractFactoryPattern 单例模式(singletonPattern) 建造者模式(builderPattern) 原型模式(prototypePattern) 适配器模式(adapterPattern) 桥接模式(bridgePattern) 过滤器模式(filterPattern) 组合...

    抽象工厂设计模式简单实例

    在给定的"NO2abstractfactorypattern"压缩包中,可能包含了不同平台(例如Windows、Linux)下的文件操作类。抽象工厂可以是`FileOperationFactory`,它声明了创建文件和目录的操作方法,如`createFile()`和`create...

    Java设计模式学习教程与案例源码.zip

    3. [抽象工厂](worthed/OriginBlog/blob/master/articles/AbstractFactoryPattern.md) 4. [建造者模式](worthed/OriginBlog/blob/master/articles/BuilderPattern.md) 5. [单例模式](worthed/OriginBlog/blob/master...

    FactoryPattern

    在`AbstractFactoryPattern`文件中,可能存在一个抽象工厂类`AbstractFactory`,它定义了创建产品的方法,而具体的工厂类如`ConcreteFactory1`和`ConcreteFactory2`则分别实现这些方法,创建出不同类型的实例。...

    IOS 设计模式抽象工厂实例Demo

    在压缩包中的`DesignPattern_AbstractFactoryPattern`文件中,应该包含了实现上述描述的完整代码示例,包括协议定义、工厂类的实现、以及如何在应用程序中使用这些工厂。通过阅读和理解这些代码,开发者可以深入掌握...

    设计模式代码

    在`AbstractFactoryPattern`文件中,可能包含一个`AbstractFactory`接口,它定义了一系列创建产品的方法,如创建窗口、按钮等。然后,有具体的工厂类如`PlatformFactoryA`和`PlatformFactoryB`实现这个接口,每个...

    23种设计模式知识要点.pdf

    抽象工厂模式(AbstractFactoryPattern): 抽象工厂模式是创建型模式,它提供了一个接口用于创建一组相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式适用于系统中有多个产品族,而系统只消费其中某一...

    Java设计模式经典搞笑珍藏

    ### 知识点二:Java设计模式的种类 根据提供的部分内容,可以看出本书涉及到多种设计模式,其中包含但不限于: 1. **策略模式(StrategyPattern)**:定义一系列算法,将每个算法封装起来,并使它们可相互替换。...

    抽象工厂模式代码

    在提供的"abstractFactoryPattern"压缩包中,可能包含了以下内容: - `AbstractFactory.java`:抽象工厂接口的定义 - `ConcreteFactory1.java` 和 `ConcreteFactory2.java`:两个具体工厂类的实现,分别创建不同产品...

    工厂模式代码实现

    - **AbstractFactoryPattern类**:定义一个抽象工厂接口`GUIFactory`,包含创建窗口和控件的方法;接着创建实现`GUIFactory`的子类,如`WindowsGUIFactory`和`MacOSGUIFactory`,它们分别创建对应平台的窗口和控件。...

    Head First设计模式源代码.rar

    "AbstractFactoryPattern"目录下的代码可能展示如何创建一系列相关对象,而无需关心它们的实现细节。 4. 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。"BuilderPattern...

    《Head First 设计模式》附书源码(Java版)

    `AbstractFactoryPattern`包可能包含不同的工厂接口和实现,用于创建不同平台或环境下的对象。 4. **建造者模式(Builder)**:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。`Builder...

    iOS 设计模式 工厂模式

    在提供的压缩包`AbstractFactoryPattern-master`中,可能包含了更多关于工厂模式的示例代码和深入解释,你可以进一步研究学习,以加深对工厂模式的理解,并将其应用到你的iOS项目中。通过熟练掌握工厂模式,你的代码...

Global site tag (gtag.js) - Google Analytics