工厂模式

简介:

              工厂模式有三种,分别是简单工厂、工厂方法、抽象工厂。

简单工厂简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,例如case或者if-else等。没有抽象工厂类,仅有产品抽象。简单工厂模式缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的case或者if-else等也越多,这样就会造成简单工厂的实现逻辑过于复杂。这样的修改也是不符合【开放关闭原则OCP】,对修改代码关闭,对增加代码开放。
工厂方法工厂方法模式是解决单个对象的需求变化,即仅有一个抽象产品类,可以有多个继承抽象产品类和抽象工厂类。每个继承工厂类仅有一个继承产品类的实例。如果新增产品,需要新增继承产品抽象类、继承工厂抽象类。
抽象工厂 抽象工厂模式是结果对于多个对象的需求变化,即可有多个产品抽象类。每个继承工厂类有多个继承产品类的实例。如果新增产品,需要新增抽象工厂类、继承工厂抽象类、产品抽象类、继承产品抽象类。

 

介绍:

工厂方法模式结构
抽象工厂模式结构

 

使用:

1.简单工厂

    //工厂类
    public class Factory
    {
        public static IDraw GetDraw(string type)
        {
            IDraw draw = null;
            switch (type)
            {
                case "Square": draw = new SquareDraw(); break;
                case "Circle": draw = new CircleDraw(); break;
                default: break;
            }
            return draw;
        }
    }
    
    //抽象产品类
    public abstract class IDraw
    {
        public abstract void Draw();
    }

    //继承产品类
    public class SquareDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }

    //继承产品类
    public class CircleDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }
 //简单工厂调用
 IDraw draw = Factory.GetDraw("Square");
 raw.Draw();

 draw = Factory.GetDraw("Circle");
 draw.Draw();

 

2.工厂方法

    //抽象工厂类 
    public abstract class IFactory
    {
        public abstract IDraw GetDraw();
    }

    //继承工厂抽象类
    public class SquareFactory:IFactory
    {
        public override IDraw GetDraw()
        {
            IDraw draw = new SquareDraw();
            return draw;
        }
    }

    //继承工厂抽象类
    public class CircleFactory : IFactory
    {
        public override IDraw GetDraw()
        {
            IDraw draw = new CircleDraw();
            return draw;
        }
    }

    //产品抽象类
    public abstract class IDraw
    {
        public abstract void Draw();
    }

    //继承产品抽象类
    public class SquareDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }

    //继承产品抽象类
    public class CircleDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }
//工厂方法调用
IFactory fact = new SquareFactory();
IDraw draw = fact.GetDraw();
draw.Draw();

fact = new CircleFactory();
draw = fact.GetDraw();
draw.Draw();

 

 3.抽象工厂

    //抽象工厂类
    public abstract class IFactory
    {
        //产品的抽象方法
        public abstract IDraw GetDraw();
        public abstract IPrint GetPrint();
    }

    //继承工厂类
    public class SquareFactory : IFactory
    {
        //产品类的实例
        public override IDraw GetDraw()
        {
            IDraw draw = new SquareDraw();
            return draw;
        }

        //产品类的实例
        public override IPrint GetPrint()
        {
            IPrint print = new SquarePrint();
            return print;
        }
    }

    //继承工厂类
    public class CircleFactory : IFactory
    {
        public override IDraw GetDraw()
        {
            IDraw draw = new CircleDraw();
            return draw;
        }
        public override IPrint GetPrint()
        {
            IPrint print = new CirclePrint();
            return print;
        }
    }

    //抽象产品类
    public abstract class IDraw
    {
        public abstract void Draw();
    }

    //继承产品类
    public class SquareDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }

    //继承产品类
    public class CircleDraw : IDraw
    {
        public override void Draw()
        {
           //do something
        }
    }

    //抽象产品类
    public abstract class IPrint
    {
        public abstract void Print();
    }

    //继承产品类
    public class SquarePrint : IPrint
    {
        public override void Print()
        {
           //do something
        }
    }

    //继承产品类
    public class CirclePrint : IPrint
    {
        public override void Print()
        {
           //do something
        }
    }
//抽象工厂调用
IFactory fact = new SquareFactory();
fact.GetDraw();
fact.GetPrint();
 
fact = new CircleFactory();
fact.GetDraw();
fact.GetPrint();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值