【设计模式】C#实现工厂方法模式

简介: 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

1、概述

针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

工厂方法模式的主要角色:

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

2、工厂方法模式实现思路

首先,我们先创建一个简单的类。

//1.抽象产品类
public abstract class Pizza
    {
        //名字
        public string Name;

        //准备原材料
        public abstract void Prepare();

        public void Bake()
        {
            Console.WriteLine($"{this.Name} bake");
        }

        public void Cut()
        {
            Console.WriteLine($"{this.Name} cut");
        }

        public void Box()
        {
            Console.WriteLine($"{this.Name} box");
        }

    }

//2.具体产品类
public class GreekPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("GreekPizza 准备原材料");
        }
    }

//2.具体产品类
public class CheessPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("CheessPizza 准备原材料");
        }
    }

//3.抽象工厂类
public abstract class PizzaFactory
    {
       public abstract Pizza CreatePizza();
    }

//4.具体工厂类
public class CheessPizzaFactory : PizzaFactory
    {
        public override Pizza CreatePizza()
        {
            CheessPizza cheessPizza = new CheessPizza();
            cheessPizza.Name = "奶酪披萨";
            cheessPizza.Prepare();
            cheessPizza.Bake();
            cheessPizza.Cut();
            cheessPizza.Box();
            return cheessPizza;
        }
    }
//4.具体工厂类
public class GreekPizzaFactory:PizzaFactory
    {
        public override Pizza CreatePizza()
        {
            GreekPizza greekPizza = new GreekPizza();
            greekPizza.Name = "希腊披萨";
            greekPizza.Prepare();
            greekPizza.Bake();
            greekPizza.Cut();
            greekPizza.Box();
            return greekPizza;
        }
    }

//5.订购披萨
    public class PizzaStore
    {
        PizzaFactory _pizzaFactory;
        public void setPizzaFactory(PizzaFactory pizzaFactory)
        {
            this._pizzaFactory = pizzaFactory;
        }
        public Pizza OrderPizza()
        {
            Pizza pizza = _pizzaFactory.CreatePizza();
            return pizza;
        }
    }

//使用工厂方法模式
class Program
    {
        static void Main(string[] args)
        {
            PizzaStore pizzaStore = new PizzaStore();
            PizzaFactory greekPizzaFactory = new GreekPizzaFactory();
            pizzaStore.setPizzaFactory(greekPizzaFactory);
            pizzaStore.OrderPizza();

            PizzaFactory cheessPizzaFactory = new CheessPizzaFactory();
            pizzaStore.setPizzaFactory(cheessPizzaFactory);
            pizzaStore.OrderPizza();
        }
    }

******************【运行结果】******************
GreekPizza 准备原材料
希腊披萨 bake
希腊披萨 cut
希腊披萨 box
CheessPizza 准备原材料
奶酪披萨 bake
奶酪披萨 cut
奶酪披萨 box

从以上的编写的代码可以看到,要增加产品类时也要相应地增加工厂类,不需要修改工厂类的代码了,这样就解决了简单工厂模式的缺点。

工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

3、 优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
相关文章
|
6天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 构造函数模式
js设计模式【详解】—— 构造函数模式
15 6
|
11天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
11天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
14 2
|
12天前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式
9 1
|
17天前
|
设计模式 Java 数据库连接
Java设计模式之工厂方法模式详解
Java设计模式之工厂方法模式详解
|
17天前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
20天前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
18 3
|
29天前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
39 6
|
29天前
|
设计模式 Java 关系型数据库
设计模式第2弹:工厂方法模式
type ComputerProduct struct{} // 实现工厂方法 func (computer ComputerProduct) GetInformation() string { return "电脑,官方称呼计算机,主要用于进行数据运算的一台机器。" }
29 4
|
5天前
|
设计模式 存储 C#