代码改变世界

工厂模式

2012-05-29 20:41  刘永强  阅读(223)  评论(0)    收藏  举报
•简单工厂
•简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。(实例见备注)
•工厂方法(实例见备注)
 

简单工厂:

比方说各个省份的俱乐部要不同的运动员(篮球,足球,乒乓球运动员),就可以根据一个简单工厂(运动员协会)产生相应的运动员:

我们可以设计一个“运动员”接口,“足球运动员”和“篮球运动员”都实现“运动员”这个接口。而“运动员协会”就是一个简单工厂类,它负责实例化“运动员”。

运动员接口

public interface IAthlete

    {

       void Run();

       void Jump();

    }

足球运动员:

public class Footballer:IAthlete

    {

        public void Run()

        {

            Console.WriteLine("足球运动员跑");

        }

 

        public void Jump()

        {

            Console.WriteLine("足球运动员跳");

        }

    }

篮球运动员:

 public class Basketballer:IAthlete

    {

        public void Run()

        {

            Console.WriteLine("篮球运动员跑");

        }

 

        public void Jump()

        {

            Console.WriteLine("篮球运动员跳");

        }

    }

工厂:

 public class Factory

    {

       public static IAthlete CreateFootballer()

       {

           return new Footballer();

       }

 

       public static IAthlete CreateBasketballer()

       {

           return new Basketballer();

       }

    }

 

工厂方法:

  运动员接口

public interface IAthlete

    {

       void Run();

       void Jump();

    }

足球运动员:

public class Footballer:IAthlete

    {

        public void Run()

        {

            Console.WriteLine("足球运动员跑");

        }

 

        public void Jump()

        {

            Console.WriteLine("足球运动员跳");

        }

    }

篮球运动员:

 public class Basketballer:IAthlete

    {

        public void Run()

        {

            Console.WriteLine("篮球运动员跑");

        }

 

        public void Jump()

        {

            Console.WriteLine("篮球运动员跳");

        }

//相当于抽象工厂

 public interface IFactory

    {

        IAthlete CreateAthlete();

    }

//篮球工厂

public class basketFactory:IFactory

    {

        public IAthlete CreateAthlete()

        {

            return new Basketballer();

        }

    }

//足球工厂

public class FootFactory:IFactory

    {

        public IAthlete CreateAthlete()

        {

            return new Footballer();

        }

    }

 

•一般抽象工厂共分为四个部分:
•1抽象工厂:为创建对象提供一般的接口
•2实体工厂:抽象工厂的实现
•3抽象产品:定义了被创建对象的一般接口。
•4实体产品:抽象产品的实现
•我们可以简单的将抽象工厂设计模式的思路概括如下:
•1提供一系列相互依赖对象的创建。
•2封装对象的常规创建方法(new)
•3提供统一访问数据方法的方式
•4避免调用数据访问方法和具体对象创建工作的紧耦合

抽象工厂:

抽象工厂类public abstract class AbstractFactory

    {

        public static AbstractFactory CreateFactory(string name)

        {

            switch (name)

            {

                case "Nokia":

                    return new NokiaFactory();

                break;

                case "Apple":

                return new AppleFactory();

                break;

                default:

                return null;

            }

        }

        //两个厂家都有3G和CDMA手机

        public abstract I3G Create3G();

        public abstract ICDMA CreateCDMA();

    }

 

 //定义3G手机接口

   public interface I3G

    {

       void F3G();

    }

//定义CDMA接口

 public interface ICDMA

    {

       void FCDMA();

    }

诺基亚实现类

 public class Nokia3G:I3G

    {

        public void F3G()

        {

            HttpContext.Current.Response.Write(string.Format("{0}",this.GetType().Name));

        }

    }

 public class NokiaCDMA:ICDMA

    {

        public void FCDMA()

        {

            HttpContext.Current.Response.Write(string.Format("{0}",this.GetType().Name));

        }

    }

 

苹果的实现类:

public class Apple3G:I3G

    {

        public void F3G()

        {

            HttpContext.Current.Response.Write(string.Format("{0}", this.GetType().Name));

        }

    }

 public class AppleCDMA:ICDMA

    {

        public void FCDMA()

        {

            HttpContext.Current.Response.Write(string.Format("{0}", this.GetType().Name));

        }

    }

诺基亚工厂

 public class NokiaFactory:AbstractFactory

    {

        public override I3G Create3G()

        {

            return new Nokia3G();

        }

 

        public override ICDMA CreateCDMA()

        {

            return new NokiaCDMA();

        }

    }

 

苹果工厂:

 public class AppleFactory:AbstractFactory

    {

        public override I3G Create3G()

        {

            return new Apple3G();

        }

 

        public override ICDMA CreateCDMA()

        {

            return new AppleCDMA();

        }

    }

 

 

 

•一、单例模式是用来实现在整个程序中只有一个实例的。
 
•二、单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点。
 
•三、单例模式在多线程下的同步问题和性能问题的解决。
 
•四、懒汉式和饿汉式单例类。
 
•五、C# 中使用静态初始化实现饿汉式单例类