【转】工厂模式面向接口编程
为了实现更好的灵活性
应改面向接口编程。因此,应该面向接口提供工场。
比如,Cat, Dog, Mouse,都是4条腿会跑的动物。
因此,我们建立一个接口叫做FourLegs
interface FourLegs {
void run();
}
我们可能需要一个实验使用一个会跑得动物
比如,我们要一个发电机,但是不管什么
只要会跑得动物都可以来发电
class ElectricProducer {
void produceBy(FourLegs fourLegs){
...dosomething..
fourLegs.run();
}
}
我们需要一个工场来管理动物的创建,因为有可能增加很多动物。
OCP原则,就是说,对类的扩展要open类,对类的修改要close
class FourLegFactory{
FourLegFactory factory() {
return ...
}
}
这里面factory的实现可以是通过配置文件,也可以是通过参数等等
反正是产生了一个Cat,Dog或者Mouse的实例。这我们不关注是什么
Client代码{
FourLeg fourLeg = FourLegFactory.factroy();
ElectricProducer.produceBy(fourLeg)
}
这样我们的发电机正常运作了
而且通过修改某种系统设置,可以更换任何一种动物来帮忙发电
试想,如果我们用FourLeg fourLeg = new Mouse();
那么一旦许要换成Cat,还需要修改Client的代码。
这就是simple factory
原文:http://www.cnblogs.com/min10/archive/2008/10/17/1313632.html
下面是另一篇相关的文章:
去年“面向对象程序设计”课程的最后一道大题是用“类工厂”模式实现一个数据库组件。“类工厂”的类里对于不同数据库类型的处理是用switch...case语句来实现的,但这不符合面向对象的设计原则。如:工厂里只判断了两种数据库类型,如果再增加一个数据库类型势必要改写“类工厂”的代码(即,再加一条case语句)。问题是:如何利用合理的设计方法改善这种弊端。
今天有研一的同事问起我,正好我对这个也是云里雾里。顺便问了一下高手,具体实现了出来。与大家共勉。
大的方向是利用“面向接口编程”的理论来实现。
首先,定义一个接口,接口里写了一些抽象的方法。如:得到数据库连接,根据sql语句得到结果集。
第二,定义不同数据库类型对接口中的抽象方法的具体实现的类。如:OracleAccess,SqlAccess。这些类中一定包含与上面接口中的抽象方法具有相同签名的方法。方法中有具体实现功能代码。
第三,定义“类工厂”,“类工厂”中的构造方法需要有一个入参,即,数据库类型(dbType)。还要有一个得到具体类的实例的方法。
第四,如果你不嫌麻烦,还可以写一个读取配置文件的类。当然不写也可以。
第五,编辑一个配置文件,我这里用的是.properties文件。文件中就是key和value对应的关系。如:oracle=OracleAccess。其中,value就是要返回的实例的类名称。
好了,现在看看各类的具体代码。这里为了方便起见,我用的返回不同字符串的方法。没有用数据库的操作。
1、接口:
public interface IDBAccess {
public String getString();
}
2、实现接口的具体类:
public class OracleAccess implements IDBAccess{
public OracleAccess(){
}
public String getString(){
String conn = "oracle instance";
return conn;
}
}
public class SqlAccess implements IDBAccess{
public SqlAccess(){
}
public String getString(){
return "sql instance";
}
}
3、类工厂
public class DBFactory {
private String instance;
public DBFactory(String dbType){
instance = (String)ConstantLib.getInstance().context.get(dbType);
}
public IDBAccess getInstance() throws Exception{
IDBAccess dbInstance = (IDBAccess)((Class.forName(instance)).newInstance());
return dbInstance;
}
}
4、配置文件的编辑
oracle=OracleAccess
sql=SqlAccess
5、现在可以写一个测试程序了,看看能不能运行。
public class test {
public static void main(String args[]) throws Exception{
DBFactory dbFactory = new DBFactory("sql");
IDBAccess instance = dbFactory.getInstance();
System.out.println(instance.getString());
}
}
看看能不能输出sql instance这个字符串,把工厂的入参该成oracle试试。能不能输出oracle instance这个字符串。
地址:http://blog.163.com/wu_qihui/blog/static/91489033201106103241593/
问题:如果某个接口被多个对象实现,那么如何动态实例化对象?
转载于:https://www.cnblogs.com/Leon-LYH/p/4104921.html
【转】工厂模式面向接口编程相关推荐
- 策略模式-面向接口编程
策略模式-面向接口编程 定义 定义了一系列算法,并将每一个算法封装起来,而且使他们可以相互替换.让算法独立于使用它的客户而独立变化. 使用场景 同一类型的问题又多种算法解决. 需要安全的封装多种同一类 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- Java中的面向接口编程
面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...
- java继续_Java中消除实现继续和面向接口编程
在匆忙之际理清消除实现继续和面向接口编程这样两个大题目可不是一件轻易的事情,尤其考虑到自身的熟悉水平.坦白的说,这又是一篇"炒冷饭"的文章,但这"冷饭"又确实不 ...
- 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...
那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰--依赖倒置•控制反转•依赖注入•面向接口编程.也 ...
- 【转】那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
作者:在好 链接:https://www.zhihu.com/question/31021366/answer/102239756 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- 面向接口编程VS《倚天屠龙记》里张三丰教无忌打太极
搞笑哈,只细想想,编程和太极怎么能联系在一起了,是八秆子也打不着的哈! 昨天看了一篇文章是关于面向接口编程的文章,颇有心得,其实在今天中国IT软件行业的盛行,程序员们突飞猛涨,真正算的上程序员的又有几 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- 我理解的面向接口编程
从题外话说起,在古代没有货币的时候,人们只能用某一样东西去换取自己需要的另一样东西.比如,张三需要一匹布,李四需要一头鹅,正巧张三有一头鹅,李四有一匹布,于是他们达成了共识,拿布与鹅进行交换,各取所需 ...
最新文章
- Android应用资源---布局资源类型(Layout)
- python 实现杨辉三角(依旧遗留问题)
- NMAP扫描技巧:TCP空闲扫描
- vs最好的版本_Win10 环境下,LightGBM GPU 版本的安装
- poj3335 半平面交
- php中msubstr,PHP学习:thinkphp中字符截取函数msubstr()用法分析
- [转载] Java中的命名参数
- MBG配置详解及最佳实践
- 马斯克证实:特斯拉将加大在中国的投资和研发力度
- Linux下磁盘阵列raid
- 斯坦福 AIMI 打造世界更大的开源医学数据集
- Navicat:navicat数据库始终保持连接的方法
- Micropython TurnipBit 旋转按钮控制直流电机转速(儿时记忆中的吊扇)
- 1000道Python题库系列分享三(30道)
- Android中的Apk的加固(加壳)原理解析和实现
- HTML邮件 兼容问题
- android 隐藏电池,Android8.1隐藏状态栏电池图标
- HC05蓝牙模块(主从一体)简单使用
- Python 从入门到放弃(三)
- 链接服务器“(null)“的 OLE DB 访问接口 “SQLNCLI10“ 返回了消息 “客户端无法建立