zoukankan      html  css  js  c++  java
  • 简单工厂,工厂方法,抽象工厂

    一,简单工厂

    描述:是由一个工厂对象根据接收到的消息去决定返回的实例,可以用if,switch判断

    优点:客户端只需要去告诉工厂需要什么对象就行,不需要关心怎么创建的,当引入新的产品不需要改变代码,只需添加一个产品类即可.并加以修改工厂类.

    从产品角度去看,符合开闭原则.

    缺点:当产品较多时,就要频繁修改工厂类,逻辑比较复杂.不利于扩展和维护,从工厂角度来看,不符合开闭原则.

          static void Main(string[] args)
                    {
                        Product fac = Factory.Create("雷神电脑");
                        fac.DianNao();
                        Console.ReadKey();
                    
    
                    }
    //工厂类
    public  class Factory
        {
            public static Product Create(string Name)
            {
                switch (Name)
                {
                    case "惠普电脑":return new ConcreteProductA();
                    case "雷神电脑": return new ConcreteProductB();
                    default:return null;
                }
            }
        }
    
    //抽象产品
    public interface Product
        {
              void DianNao();
        }
    //产品A
    public class ConcreteProductA:Product
        {
            public  void DianNao()
            {
                Console.WriteLine("惠普电脑");
            }
        }
    //产品B
     public  class ConcreteProductB:Product
        {
       
    
            public  void DianNao()
            {
                Console.WriteLine("雷神电脑");
            }
        }

    二,工厂方法

    1.描述:创建一个工厂接口,由子工厂去创建实例,把创建实例推迟到子工厂中,

    2.优点:

    把简单的逻辑放到客户端,不用去修改工厂代码,克服了简单工厂违背的开闭原则,便于维护,扩展,添加新产品,只需添加一个工厂类即可.

     class Program
        {
            static void Main(string[] args)
            {
                AbstractFactory abs = new ConcreteFactoryA();
                abs.ConcreteFactory().DianNao();
                AbstractFactory ab = new ConcreteFactoryB();
                abs.ConcreteFactory().DianNao();
                Console.ReadKey();
            }
        }
    
    //工厂接口
     public  interface   AbstractFactory
        {
          
              AbstractProduct ConcreteFactory();
    
        }
    //抽象产品
      public interface  AbstractProduct
        {
            void DianNao();
         
        }
    //实际产品A
    public class ConcreteFactoryA:AbstractFactory
        {
            public   AbstractProduct ConcreteFactory()
            {
                return new ProductA();
            }
    
          
        }
    //实际产品B
     public  class ConcreteFactoryB:AbstractFactory
        {
            public  AbstractProduct ConcreteFactory()
            {
                return new ProductB();
            }
        }

    三,抽象工厂

    1:描述:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

      2:优点:(1):当一个产品族中的多个对象被设计在一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

            (2):具有工厂方法模式解耦的优点。

            (3):工厂方法模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构,最主要的是可以在类的内部对产品族的关联关系进行定义和描述。

      3:例子:以生产两款车子为例,一个工厂生产宝马和比亚迪两款汽车,同时生产国产和进口两种发动机。

     class Program
        {
            static void Main(string[] args)
            {
                IFactory carAFactory = new CarA();
                carAFactory.ProductCar().ProductCar();
                carAFactory.ProductEngine().ProductEngine();
    
                IFactory carBFactory = new CarB();
                carBFactory.ProductCar().ProductCar();
                carBFactory.ProductEngine().ProductEngine();
    
                Console.ReadKey();
    
            }
        }
        public interface ICarProduct
        {
            void ProductCar();
        }
        public class BMWCar : ICarProduct
        {
            public void ProductCar()
            {
                Console.Write("宝马汽车:");
            }
        }
        public class BYDCar : ICarProduct
        {
            public void ProductCar()
            {
                Console.Write("比亚迪汽车:");
            }
        }
        public interface IEngineProduct
        {
            void ProductEngine();
        }
        public class DomesticEngine : IEngineProduct
        {
            public void ProductEngine()
            {
                Console.WriteLine("国产发动机");
            }
        }
        public class ImportEngine : IEngineProduct
        {
            public void ProductEngine()
            {
                Console.WriteLine("进口发动机");
            }
        }
        public interface IFactory
        {
            ICarProduct ProductCar();
            IEngineProduct ProductEngine();
        }
        public class CarA : IFactory//宝马汽车,进口发电机
        {
            public ICarProduct ProductCar()
            {
                return new BMWCar();
            }
            public IEngineProduct ProductEngine()
            {
                return new ImportEngine();
            }
        }
        public class CarB : IFactory//比亚迪汽车,国产发电机
        {
            public ICarProduct ProductCar()
            {
                return new BYDCar();
            }
            public IEngineProduct ProductEngine()
            {
                return new DomesticEngine();
            }
        }
  • 相关阅读:
    分享一个关于Cookie做的实验结果
    使用jest进行单元测试
    【转载】为什么单反镜头做不小,镜头越好越重呢?
    【转载】解读手机摄像头
    【转载】2019中国机器视觉产业全景图谱
    【行业】视觉传感器
    图像质量测评
    COM口了解下
    dbus-python的API及示例
    QtDbus的API及示例
  • 原文地址:https://www.cnblogs.com/gbb44/p/10642763.html
Copyright © 2011-2022 走看看