zoukankan      html  css  js  c++  java
  • 工厂模式

    工厂模式特点:

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

    使用场景:

    • 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
    • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
    • 设计一个连接服务器的框架,需要三个协议,"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 时:

  • 相关阅读:
    [速记]关于指针,引用和递归和解递归——C++
    查找(二)——基于二叉排序树的查找
    查找总结(一)-----简单查找和折半查找
    jdk代理和cglib代理
    IOC和AOP使用扩展 多种方式实现依赖注入
    InputStream和Reader
    Spring IoC
    Spring AOP(aspect oriented programming) 转载
    数据校验与国际化
    Struts2 之 实现文件上传(多文件)和下载
  • 原文地址:https://www.cnblogs.com/xbblogs/p/8308891.html
Copyright © 2011-2022 走看看