面向对象基础:抽象 封装 多态 继承
面向对象原则:封装变化 多用组合 少用继承 针对接口编程 依赖抽象 不依赖具体 尽量松耦合 对修改关闭 对扩展开放
前言:
工厂模式的主要思想:
将对象的创建放入工厂中,当有新的类型的子对象产生时,只需要修改工厂方法,就可以使当前类支持新的类型,易于系统维护。
在系统开发中,我们常将工厂模式应用于DB层,使DB层可以生产出“多种数据库操作类”,来应对系统的各种变化。
工厂模式的产生
一个业务应用类A
一个数据库实现包B(namespace B) (B中包含 MSSQL操作类 class MSSQL{} MySql操作类 class MySql{} Oracle操作类 class Oracle{} DB2操作类 class DB2{} …)
当A中需要使用数据库操作时,假如此时我们需要使用MSSQL操作类,这时,我们需要new一个操作对象
class A{ DB db; db = new MSSQL(); /* 在实际业务中,此处使用了具体类会导致程序不具有扩展性 当我们切换其它数据库时,需改写所有应用类中的代码 */ }
class A{ DB db; if (dbType =="MSSQL") { db = new MSSQL(); }else if(dbType =="MySql") { db = new MySql(); }else if(dbType =="Oracle") { db = new Oracle(); } ... /* 在实际业务中,当我们扩展一个数据库时,所有的应用代码都必须修正 */ }
以上两种应用代码的写法,当有变化或扩展时,就必须重新打开应用类代码进行检查和修改,由于有大量的修改,会加大系统的修改的错误几率,并且违背了”对修改关闭”的原则
所以为了修正以上,我们必须采用一种全新的编程方式,那么就是针对”接口编程”,因为针对接口编写的代码,可以支持多态,它可以关联任何实现此接口的类。
封装db对象的创建代码
class A{ DB db; /*将创建对象的代码进行抽离放入一个新的对象(DbFactory),这个新对象负责进行的创建*/ ... /*应用相关操作*/ } class DbFactory{ public Db DbFactory() { Db db; //Db为interface if (dbType =="MSSQL") { db = new MSSQL(); }else if(dbType =="MySql") { db = new MySql(); }else if(dbType =="Oracle") { db = new Oracle(); } return Db; } }
我们将DbFactory这个新对象称之为”工厂”。
工厂对象主要是处理创建对象。由于有了DbFactory对象后,当应用类A需要使用数据库操作对象时,需调用工厂类产生数据库操作类,
从class A class DbFactory 我们可以看出,DbFactory工厂主要为应用类A提供Db操作类服务。
创建一个简单DB工厂
class DbSimpleFactory{ public Db CreateDb(string dbType) //简单工厂中,定义一个CreateDb方法,所有客户使用这个方法来实例化新的对象 { Db db = null; //Db为interface if (dbType =="MSSQL") { db = new MSSQL(); }else if(dbType =="MySql") { db = new MySql(); }else if(dbType =="Oracle") { db = new Oracle(); } return Db; } }
简单工厂的优点:
当增加新的数据库对象时,系统易于修改,便于维护
可以使对象在运行时,动态的组合当前符合条件的类