《Head First 设计模式》C#编程版:工厂模式之抽象工厂
小标 2018-08-13 来源 : 阅读 1131 评论 0

摘要:本文主要向大家介绍了《Head First 设计模式》C#编程版:工厂模式之抽象工厂,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了《Head First 设计模式》C#编程版:工厂模式之抽象工厂,通过具体的内容向大家展示,希望对大家学习

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class FactoryPattern1 : MonoBehaviour {

 

    void Start() {

        //我们开始正式定披萨了

        NYStylePizzeStore nYStylePizzeStore = new NYStylePizzeStore();

        nYStylePizzeStore.OrderPizza( PIZZETYPE.CHEESE);

 

        ChicagoStylePizzeStore chicagoStylePizzeStore = new ChicagoStylePizzeStore();

        chicagoStylePizzeStore.OrderPizza( PIZZETYPE.VEGGIE);

    }

 

}

/*

    抽象工厂模式

        提供一个接口,用于创建相关或者依赖的家族,而不需要指明具体类。

 

 

    依赖倒置原则

        1、变量不可以持有具体类的引用

        2、不要让类派生自具体类

        3、不要覆盖基类中已实现的方法

 

*/

#region 运用依赖倒置原则的工厂模式

 

/// <summary>

/// 建造披萨原料工厂 接口

/// </summary>

public interface  PizzaIngredientFactory {

    Dough       CreateDough();

    Sauce       CreateSauce();

    Cheese      CreateCheese();

    Veggies[]   CreateVeggies();

    Pepperoni CreatePepperoni();

    Clams       CreateClam();

}

/// <summary>

/// 纽约披萨工厂

/// </summary>

public class NYPizzaIngredientFactory : PizzaIngredientFactory{

    public  Dough CreateDough(){

        return new NYDough();

    }

    public Sauce CreateSauce(){

        return new NYSauce();

    }

    public Cheese CreateCheese(){

        return new NYCheese();

    }

    public Veggies[] CreateVeggies(){

        Veggies[] veggies = { new NYVeggies(),new Onion(),new Garlic()};

        return veggies;

    }

    public Pepperoni CreatePepperoni(){

        return new NYPepperoni();

    }

    public Clams CreateClam(){

        return new NYClams();

    }

}

 

/// <summary>

/// 芝加哥披萨工厂

/// </summary>

public class ChicagoPizzaIngredientFactory : PizzaIngredientFactory {

    public Dough CreateDough() {

        return new ChicagoDough();

    }

    public Sauce CreateSauce() {

        return new ChicagoSauce();

    }

    public Cheese CreateCheese() {

        return new ChicagoCheese();

    }

    public Veggies[] CreateVeggies() {

        Veggies[] veggies = { new ChicagoVeggies(), new Onion(), new Garlic() };

        return veggies;

    }

    public Pepperoni CreatePepperoni() {

        return new ChicagoPepperoni();

    }

    public Clams CreateClam() {

        return new ChicagoClams();

    }

}

 

/// <summary>

/// Pizza 抽象类

/// </summary>

public abstract class Pizza {

 

    public string name;

    /// <summary>

    /// 面团

    /// </summary>

    public Dough dough;

    /// <summary>

    /// 酱汁

    /// </summary>

    public Sauce sauce;

    public Cheese cheese;

    public Veggies[] veggies;

    public Pepperoni pepperoni;

    public Clams clams;

    /// <summary>

    /// 披萨准备流程

    /// </summary>

    public abstract void Prepare();

 

    public virtual void Back() {

        Debug.Log("烧烤 25分钟");

    }

    public virtual void Cut() {

        Debug.Log("切片  圆形");

    }

    // C# 重写改方法 必须在父类中加上 virtual  子类中使用 override

    public virtual void Box() {

        Debug.Log("包装  普通披萨标准");

    }

    public virtual void SetName(string name){

        this.name = name;

    }

    public string GetName() {

        return name;

    }

    public virtual string ToStringPizze(){

        return "";

    }

}

 

/// <summary>

/// 奶酪披萨

/// </summary>

public class CheesePizze : Pizza{

    PizzaIngredientFactory pizzaIngredientFactory;

    public CheesePizze(PizzaIngredientFactory pizzeF){

        this.pizzaIngredientFactory = pizzeF;

        this.SetName(" 奶酪披萨  ");

    }

    public override void Prepare() {

 

        Debug.Log(" Prepare " + GetName());

 

        dough = pizzaIngredientFactory.CreateDough();

        sauce = pizzaIngredientFactory.CreateSauce();

        cheese = pizzaIngredientFactory.CreateCheese();

    }

    public override void Box() {

        Debug.Log("包装  纽约披萨标准");

    }

 

 

}

 

/// <summary>

/// 蛤蜊披萨

/// </summary>

public class ClamPizze : Pizza {

    PizzaIngredientFactory pizzaIngredientFactory;

    public ClamPizze(PizzaIngredientFactory pizzeF) {

        this.pizzaIngredientFactory = pizzeF;

        this.SetName(" 蛤蜊披萨  ");

    }

    public override void Prepare() {

 

        Debug.Log(" Prepare " + GetName());

 

        dough = pizzaIngredientFactory.CreateDough();

        sauce = pizzaIngredientFactory.CreateSauce();

        cheese = pizzaIngredientFactory.CreateCheese();

        clams = pizzaIngredientFactory.CreateClam();

 

    }

}

/// <summary>

/// 蔬菜披萨

/// </summary>

public class VeggiePizze : Pizza {

    PizzaIngredientFactory pizzaIngredientFactory;

    public VeggiePizze(PizzaIngredientFactory pizzeF) {

        this.pizzaIngredientFactory = pizzeF;

        this.SetName(" 蔬菜披萨  ");

    }

    public override void Prepare() {

 

        Debug.Log(" Prepare " + GetName());

 

        dough = pizzaIngredientFactory.CreateDough();

        sauce = pizzaIngredientFactory.CreateSauce();

        cheese = pizzaIngredientFactory.CreateCheese();

        veggies = pizzaIngredientFactory.CreateVeggies();

    }

}

/// <summary>

/// 香肠披萨

/// </summary>

public class PepperoniPizze : Pizza{

    PizzaIngredientFactory pizzaIngredientFactory;

    public PepperoniPizze(PizzaIngredientFactory pizzaIngredient){

        this.pizzaIngredientFactory = pizzaIngredient;

        this.SetName(" 香肠披萨  ");

    }

    public override void Prepare() {

        Debug.Log(" Prepare " + GetName());

 

        dough = pizzaIngredientFactory.CreateDough();

        sauce = pizzaIngredientFactory.CreateSauce();

        cheese = pizzaIngredientFactory.CreateCheese();

        veggies = pizzaIngredientFactory.CreateVeggies();

        pepperoni = pizzaIngredientFactory.CreatePepperoni();

    }

}

 

#region 披萨店

public enum PIZZETYPE {

    CHEESE,

    VEGGIE,

    CLAM,

    PEPPERONI

}

/// <summary>

/// Pizze store 抽象类

/// </summary>

public abstract class PizzeStore {

 

    public Pizza OrderPizza(PIZZETYPE type) {

        Pizza pizza;

        pizza = CreatrPizza(type);

        pizza.Prepare();

        pizza.Back();

 

        pizza.Cut();

        pizza.Box();

        return pizza;

    }

    /// <summary>

    /// 抽象的工厂方法  让子类负责定义自己的工厂方法

    /// </summary>

    /// <returns>The pizza.</returns>

    ///<param name="type">Type.

    public abstract Pizza CreatrPizza(PIZZETYPE type);

}

 

/// <summary>

/// 纽约风格的披萨店

/// </summary>

public class NYStylePizzeStore : PizzeStore {

    public PizzaIngredientFactory pizzaIngredientFactory;

    public NYStylePizzeStore() {

        pizzaIngredientFactory = new NYPizzaIngredientFactory();

 

    }

    public override Pizza CreatrPizza(PIZZETYPE type) {

        switch (type) {

            case PIZZETYPE.CHEESE:

                return new CheesePizze(pizzaIngredientFactory);

            case PIZZETYPE.VEGGIE:

                return new VeggiePizze(pizzaIngredientFactory);

            case PIZZETYPE.CLAM:

                return new ClamPizze(pizzaIngredientFactory);

            case PIZZETYPE.PEPPERONI:

                return new PepperoniPizze(pizzaIngredientFactory);

 

            default:

                return null;

 

        }

    }

 

}

/// <summary>

/// 纽约风格的披萨店

/// </summary>

public class ChicagoStylePizzeStore : PizzeStore {

 

    public PizzaIngredientFactory pizzaIngredientFactory;

    public ChicagoStylePizzeStore() {

        pizzaIngredientFactory = new ChicagoPizzaIngredientFactory();

    }

 

    public override Pizza CreatrPizza(PIZZETYPE type) {

        switch (type) {

            case PIZZETYPE.CHEESE:

                return new CheesePizze(pizzaIngredientFactory);

            case PIZZETYPE.VEGGIE:

                return new VeggiePizze(pizzaIngredientFactory);

            case PIZZETYPE.CLAM:

                return new ClamPizze(pizzaIngredientFactory);

            case PIZZETYPE.PEPPERONI:

                return new PepperoniPizze(pizzaIngredientFactory);

 

            default:

                return null;

 

        }

    }

}

 

 

 

#endregion

 

// ============== 各种原料 ============

/// <summary>

/// 面团

/// </summary>

public interface  Dough{

    void Dough();

}

public class NYDough : Dough{

    public void Dough(){

        Debug.Log("NYDough ");

    }

}

public class ChicagoDough : Dough {

    public void Dough() {

        Debug.Log("ChicagoDough ");

    }

}

/// <summary>

/// 果酱

/// </summary>

public interface Sauce{

    void Sauce();

}

public class NYSauce : Sauce {

    public void Sauce(){

        Debug.Log("NYSauce ");

    }

}

public class ChicagoSauce : Sauce {

    public void Sauce() {

        Debug.Log("ChicagoSauce ");

    }

}

/// <summary>

/// 奶酪

/// </summary>

public interface Cheese{

    void Cheese();

}

public class NYCheese : Cheese {

    public void Cheese() {

        Debug.Log("NYCheese ");

    }

}

public class ChicagoCheese : Cheese {

    public void Cheese() {

        Debug.Log("ChicagoCheese ");

    }

}

/// <summary>

/// 蔬菜

/// </summary>

public interface Veggies {

    void Veggies();

}

public class NYVeggies : Veggies {

    public void Veggies() {

        Debug.Log("NYVeggies ");

    }

}

public class ChicagoVeggies : Veggies {

    public void Veggies() {

        Debug.Log("ChicagoVeggies ");

    }

}

/// <summary>

/// 意大利香肠

/// </summary>

public interface Pepperoni {

    void Pepperoni();

}

public class NYPepperoni : Pepperoni {

    public void Pepperoni() {

        Debug.Log("NYPepperoni ");

    }

}

public class ChicagoPepperoni : Pepperoni {

    public void Pepperoni() {

        Debug.Log("ChicagoPepperoni ");

    }

}

/// <summary>

/// 蛤蜊 geli

/// </summary>

public interface Clams{

    void Clams();

}

public class NYClams : Clams {

    public void Clams() {

        Debug.Log("NYClams ");

    }

}

public class ChicagoClams : Clams {

    public void Clams() {

        Debug.Log("ChicagoSauce ");

    }

}

 

public class Garlic :Veggies{

    public void Veggies() {

        Debug.Log("Garlic ");

    }

}

public class Onion :Veggies {

    public void Veggies() {

        Debug.Log("Onion ");

    }

}

 

#endregion

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程