C# 抽象工厂

C# 抽象工厂

工厂模式 虽然可以解决多种产品的需求变更,但是还是不能解决单个产品的需求变更,加入某种产品需求变更,可以升级了!那么工厂模式将不再符合当前的设计模式,所以有了抽象工厂,在工厂设计模式中,每个工厂返回的产品对象是固定的, 抽象工厂提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类

产品类

产品多了一个属性 : 等级
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyProduct
{
    public enum ProductType
    {
        product1,
        product2,
    }


    public abstract class Product
    {
        public ProductType productType;

        //新增产品的等级
        public int productLevel;
        public abstract void printProductName();
    }


    public class Product1 : Product
    {
        public override void printProductName()
        {
            Console.WriteLine("this is Product1 level = {0} ",this.productLevel);
        }
        public Product1()
        {
           
            this.productType = ProductType.product1;
        }
       
    }
    public class Product2 : Product
    {
        public override void printProductName()
        {
            Console.WriteLine("this is Product2 level = {0} ", this.productLevel);
        }
       public Product2()
        {
           
            this.productType = ProductType.product2;
        }
    }
}


工厂类

每个工厂的创建产品方法不再直接返回某个产品的对象,而是提供了两个接口,用于创建某个产品的不同等级下的产品
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using MyProduct;


namespace MyFactory
{

    //简单工厂实现  修改起来需要频繁添加  case语句 , 不易维护
    //class Factory
    //{
    //    public static Product CreateProduct(ProductType type)
    //    {
    //        Product product = null;
    //        switch (type)
    //        {
    //            case ProductType.product1:
    //                {
    //                    product = new Product1();
                        
    //                }
    //                break;
    //            case ProductType.product2:
    //                {
    //                    product = new Product2();
    //                }
    //                break;
    //            default:
    //                break;
    //        }
    //        return product;
    //    }
    //}
    



    //工厂设计模式  , 不利于同种产品在不同工厂的变化  比如产品可以升级
    //public abstract class Factory
    //{
    //    public abstract Product CreateProduct();
    //}
    //public class Factory1 : Factory
    //{
    //    public override Product CreateProduct()
    //    {
    //        return new Product1();
    //    }
    //}
    //public class Factory2 : Factory
    //{
    //    public override Product CreateProduct()
    //    {
    //        return new Product2();
    //    }
    //}

    //抽象工厂
    public abstract class Factory
    {
        public abstract Product createlevel1Procuct();
        public abstract Product createlevel2Product();
    }

    public class Factory1 : Factory
    {
        public override Product createlevel1Procuct()
        {
            Product product1 = new Product1();
            product1.productLevel = 1;
            return product1;
        }

        public override Product createlevel2Product()
        {
            Product product2 = new Product1();
            product2.productLevel = 2;
            return product2;
        }
    }


    public class Factory2 : Factory
    {
        public override Product createlevel1Procuct()
        {
            Product product1 = new Product2();
            product1.productLevel = 1;
            return product1;
        }

        public override Product createlevel2Product()
        {
            Product product2 = new Product2();
            product2.productLevel = 2;
            return product2;
        }
    }

}


具体应用

  Factory factory1 = new Factory1();

            //工厂可以根据不同的 方法创建不同等级的产品
            Product product1 = factory1.createlevel1Procuct();
            Product product1_2 = factory1.createlevel2Product();

            product1.printProductName();
            product1_2.printProductName();
       

            Factory factory2 = new Factory2();

            Product product2 = factory2.createlevel1Procuct();
            Product product2_2 = factory2.createlevel2Product();
            product2.printProductName();
            product2_2.printProductName();

运行结果


你可能感兴趣的:(C# 抽象工厂)