工厂

前面介绍了策略和单例模式,这篇文章说一下简单工厂,工厂,抽象工厂的概念和应该场景

首先,从简单工厂开始:

见上图,可以看出来,最核心的部分就是工厂类了,所有的变化都封装在这个工厂类里面,Client不用关心类的实例化

但是,可谓成也工厂类,败也工厂类

如果,实例化的对应有所变化,就需要修改核心工厂类,违背了开放-封闭原则(对修改封闭,对扩展开放)

C#版本代码实现

SimplyFactory
复制代码
   public abstract class  Simplyfactory
    {
         public  abstract   string CreateFactory();

    }
    public class SimplyA : Simplyfactory
    {
        public override string CreateFactory()
        {
            return "FactoryA";
        }
    }

    public class SimplyB : Simplyfactory
    {
        public override  string CreateFactory()
        {
            return "FactoryB";
        }
    }

    class Factory
    {
        public static Simplyfactory Create(string Type)//核心工厂类负责所有对象的创建,属于创建型模式
        {
            Simplyfactory s = null;
            switch (Type)
            {
                case "A":
                    s = new SimplyA();
                    break;
                case "B":
                    s = new SimplyB();
                    break;
                default:
                    break;
            }
            return s;
        }
    }

    class Client
    {
        static void GetSimplyFactory()
        {
            Simplyfactory simplyfactory = Factory.Create("A");
            Console.Write(simplyfactory.CreateFactory());
            Console.Read();
        }
    }
复制代码

输出结果:FactoryA

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

简单工厂模式解决的问题是如何去实例化一个合适的对象。

简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。

好的,下面介绍下工厂模式

先来图

 

 

定义一个创建对象的抽象类,有子类来决定具体实例化哪个类,使一个类的创建延迟到子类中

创建的对象Product不会变,但是对象的具体实现经常变换,如果发生变化,增加新的FacotoryMethods子类就可以了

满足对开放--封闭原则

 C#版本代码:

FactoryMethod
复制代码
 public abstract class Product
    {
        public abstract void work();
    }
    public class ProductA : Product
    {
        public override void work()
        {
            Console.Write("ProductA");
        }
    }
    public class ProductB : Product
    {
        public override void work()
        {
            Console.Write("ProductB");
        }
    }

    public abstract class FactoryMethods
    {
        public abstract Product newproduct();
    }
    //对不同产品的实例化,由不同的工厂来具体实现,每一个工厂生产具体的商品
    public class FactoryMethodA : FactoryMethods//具体工厂
    {
        public override Product newproduct()
        {
            return new ProductA();//实现具体的实例化
        }
    }
    public class FactoryMethodB : FactoryMethods//具体工厂
    {
        public override Product newproduct()
        {
            return new ProductB();//实现具体的实例化
        }
    }

    public class FactoryMethodClient
    {
        public static void GetFactoryMethod()
        {
            //产品种类是变化的,如果发生变化,新增一个工厂就可以了,在调用的地方掉用新的方法
            //体现出对修改封闭,对扩展开放,新增新的功能对原来的没有影响
            FactoryMethods factorysubA = new FactoryMethodA();
            FactoryMethods factorysubB = new FactoryMethodB();

            Product pruductA = factorysubA.newproduct();
            Product pruductB = factorysubB.newproduct();

            pruductA.work();
            pruductB.work();
        }
    }
复制代码

可以看出来,工厂模式的工厂,实例化的对象只有一个,如果实例化的对象是多个,就成了抽象工厂模式,其实工厂模式和抽象工厂也就这点区别

先来看看抽象工厂的UML图

看到了吧,唯一的区别就是工厂创建了多个对象,当然,还是在工厂子类中创建的,这一点和工厂模式是一致的

C#版本代码

   

AbstractFactory
复制代码
/*其实工厂和抽象工厂没有多大区别,只不过是抽象工厂生产的商品是多个而已
    通俗的说,就是抽象工厂模式的具体工厂里面会有多个实例具体对象的方法
    更直观的就是,抽象工厂模式每个工厂一次造多个玩意,而工厂模式的每个工厂只造一个玩意*/
    public abstract class Product
    {
        public abstract void work();
    }
    public class ProductA : Product
    {
        public override void work()
        {
            Console.Write("ProductA");
        }
    }
    public class ProductB : Product
    {
        public override void work()
        {
            Console.Write("ProductB");
        }
    }
    public abstract class Car
    {
        public abstract void Build();
    }
    public class CarA : Car
    {
        public override void Build()
        {
            Console.Write("Build CarA");
        }
    }
    public class CarB : Car
    {
        public override void Build()
        {
            Console.Write("Build CarB");
        }
    }
    public abstract class AbstractFactory
    {
        //工厂生产多个对象
        public abstract Product newproduct();
        public abstract Car newCar();
    }
    public class AbstractFactoryA : AbstractFactory
    {
        public override Product newproduct()
        {
            return new ProductA();//子类里面实现具体的实例化
        }
        public override Car newCar()
        {
            return new CarA();
        }
    }
    public class AbstractFactoryB : AbstractFactory
    {
        public override Product newproduct()
        {
            return new ProductB();//子类里面实现具体的实例化
        }
        public override Car newCar()
        {
            return new CarB();
        }
    }

    public class AbstractFactoryClient
    {
        public static void GetFactoryMethod()
        {
            AbstractFactory factorysubA = new AbstractFactoryA();
            AbstractFactory factorysubB = new AbstractFactoryA();

            Product pruductA = factorysubA.newproduct();
            Product pruductB = factorysubB.newproduct();
            Car factorycarA = factorysubA.newCar();

            factorycarA.Build();

            pruductA.work();
            pruductB.work();
        }
    }
复制代码

应用场景:封装变化点。创建一系列相互依赖的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值