工厂模式

工厂模式特点:

  • 提供了一种创建对象的最佳方式,创建对象时不会对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以

使用场景:

  • 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  • 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

最简单实现:

class Program
    {
        static void Main(string[] args)
        {
            //通过参数来实例化子类。
            IVehicle vehicle1 = FactoryVehicle.CreateVehicle("boat");
            vehicle1.go();

            IVehicle vehicle2 = FactoryVehicle.CreateVehicle("car");
            vehicle2.go();

            Console.ReadKey();
        }
    }

    //创建一个工厂,生成基于给定信息的实体类的对象
    public class FactoryVehicle
    {
        public static IVehicle CreateVehicle(string VehicleName)
        {
            switch (VehicleName.ToLower())
            {
                case "car":
                    return new Car();
                case "boat":
                    return new Boat();
                default:
                    return new Car();

            }
        }

    }

    //创建一个接口
    public interface IVehicle
    {
        void go();
    }

    #region 创建实现接口的实体类
    public class Boat : IVehicle
    {
        public void go()
        {
            Console.WriteLine("this is a boat");
        }
    }

    public class Car : IVehicle
    {
        public void go()
        {
            Console.WriteLine("this is a car");
        }
    }
    #endregion

运行结果:

 

复杂实现:

namespace 工厂模式
{
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            IFactory factory = new SqlServerFactory();
            //IFactory factory = new AccessFactory();
            IUser iu = factory.CreateUser();

            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();
            id.Insert(dept);
            id.GetDepartment(1);

            Console.Read();
        }
    }

    class User
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    class Department
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _deptName;
        public string DeptName
        {
            get { return _deptName; }
            set { _deptName = value; }
        }
    }

    interface IUser
    {
        void Insert(User user);

        User GetUser(int id);
    }

    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Sqlserver中给User表增加一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Sqlserver中根据ID得到User表一条记录");
            return null;
        }
    }

    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表增加一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据ID得到User表一条记录");
            return null;
        }
    }

    interface IDepartment
    {
        void Insert(Department department);

        Department GetDepartment(int id);
    }

    class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Sqlserver中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
            return null;
        }
    }

    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Access中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据ID得到Department表一条记录");
            return null;
        }
    }

    interface IFactory
    {
        IUser CreateUser();

        IDepartment CreateDepartment();
    }

    class SqlServerFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }

        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

    class AccessFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }
}

打印结果:

实例化SqlServerFactory时: 

实例化AccessFactory 时:

 

posted @ 2018-01-18 10:26  .追风逐月  阅读(202)  评论(0)    收藏  举报