工厂模式(Factory Method Pattern)

模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

UML类图

  • Product 抽象产品
  • ConcreteProduct 具体产品
  • Factory 抽象工厂
  • ConcreteFactory 具体工厂

    代码结构组成

    public  class FactoryApp
    {
        public static void Run()
        {
            Creator[] creators = new Creator[2];
    
            creators[0] = new ConcreteCreatorA();
            creators[1] = new ConcreteCreatorB();
    
            foreach(Creator creator in creators)
            {
                Product product = creator.FactoryMothed();
                Console.WriteLine("Created {0}", product.GetType().Name);
            }
        }
    }
    
    public class Product
    { }
    public class ConcreteProductA:Product
    { }
    public class ConcreteProductB:Product
    { }
    
    public abstract class Creator
    {
        public abstract Product FactoryMothed();
    }
    
    public class ConcreteCreatorA:Creator
    {
        public override Product FactoryMothed()
        {
            return new ConcreteProductA();
        }
    }
    
    public class ConcreteCreatorB:Creator
    {
        public override Product FactoryMothed()
        {
            return new ConcreteProductB();
        }
    }

    情景案例

    以麦当劳的汉堡为例,假设汉堡有两种牛肉堡和鸡肉堡,不同的汉堡有不同的汉堡厨师制作。

    可能有疑问:为是么是有工厂设计模式呢,反而多个多类更麻烦?

  • 重写大量重复代码: 如果创建厨师类需要复杂的过程,比如验证厨艺水平等等,并不是简单通过new就能完成,那么将这些验证放入工厂会减少重写大量重复代码
  • 容易扩展: 如果再家一个芝士堡只需添加芝士堡类与芝士堡厨师类,满足开闭原则

    public class FactoryApp
    {
        public static void Run()
        {
            BurgerCook[] burgerCook = new BurgerCook[2];
    
            burgerCook[0] = new BeefBurgerCook();
            burgerCook[1] = new ChickenBurgerCook();
    
            foreach (BurgerCook cook in burgerCook)
            {
                Burger burger = cook.MarkBurger();
                Console.WriteLine("Created {0}", burger.GetType().Name);
            }
        }
    }
    
    public class Burger
    { }
    public class BeefBurger : Burger
    { }
    public class ChickenBurger : Burger
    { }
    
    public abstract class BurgerCook
    {
        public abstract Burger MarkBurger();
    }
    
    public class BeefBurgerCook : BurgerCook
    {
        public override Burger MarkBurger()
        {
            return new BeefBurger();
        }
    }
    
    public class ChickenBurgerCook : BurgerCook
    {
        public override Burger MarkBurger()
        {
            return new ChickenBurger();
        }
    }

原文地址:https://www.cnblogs.com/LoveTomato/p/8342947.html

时间: 2024-08-29 10:09:42

工厂模式(Factory Method Pattern)的相关文章

工厂方法模式(Factory Method Pattern)

2. 工厂方法模式(Factory Method Pattern) 2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一

工厂模式--工厂方法模式(Factory Method Pattern)

2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合"开闭

设计模式-03工厂方法模式(Factory Method Pattern)

插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背"开闭原则". 1.模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮.矩形按钮.菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类有不同的实现方式从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的

设计模式之六:工厂方法模式(Factory method Pattern)

工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象工厂角色,这样做的好处是工厂方法模式可以使系统在不修改具体工厂角色的情况下进行引进新的产品. 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应. 从上图可以看出,工厂方法模式有四个角色: 抽象工厂角色(ICreator):是工厂方法模式的核心,与应用程序无

工厂模式(factory pattern)

工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素:抽象产品.具体产品.具体工厂(简单工厂),结构图如下: C++实现: //抽象产品 class Car { public: virtual string getDescription() = 0; }; //具体产品 class Audi : public Car { string getDesc

工厂方法模式 Factory Method

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. #include <iostream> using namespace std; class Fruit{ public: virtual void show()=0; }; class App

php设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——工厂方法模式(Factory Method) 4 */ 5 6 7 /* 8 * IAp

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

Software Engineering | Factory method pattern

工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象.这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象. 有时,特定类型对象的控制过程比简单地创建一个对象更复杂.在这种情况下,工厂对象就派上用场了.工厂对象可能会动态地创建产品对象的类,或者从对象池中返回一个对象,或者对所创建的对象进行复杂的配置,或者应用其他的操作. 这些类型的对象很有用.几个不同的设计模式都应用了工厂的概念,并可以使用在很多语言中.例如,在<设计模式>一书中,像工厂方法模式.抽象工厂模式.