课时89:工厂设计模式
摘要:本内容为工厂设计模式( Factory )的介绍
1. 接口的介绍
2. 程序的结构设计
3. 工厂设计
01.接口的介绍
1.1接口的基础信息
接口必须有子类,并且子类可以通过对象的向上转型来获取接口的实例化对象,在进行对象实例化的过程中存在设计问题。
1.2设计的影响
设计虽没有明确的标准,然而程序内的修改通常不影响其他部分,相对而言设计显得比较虚化,有许多成功的设计范例可供参考学习,应当深入分析其背后的目的。
举例:观察如下一个程序
Interface IFood { //定义一个食物的标准 public viod eat(); //可以吃 } class Bread implements IFood { //定义一种食物 public viod eat() {//boolean比较麻烦换成viod System.out,println(“吃面包。”); } } public class JavaDemo { public static viod main(String args[]){ IFood food=new Bread(); food.eat(); //吃面包 } }
在本程序之中根据接口进行子类的定义,并且利用对象的向上转型进行接口对象实例化处理,程序执行后结果如下:
02.程序的结构设计
2.1主类、IFood、Bread之间的关系
在整个代码之中第一是主类(客户端),其后是IFood(食物),最后的实现位是Bread(面包)。在主类过程中必须明确的知道具体的子类,在其代码之中”IFood food=new Bread();“最为重要。
主类(客户端)需要明确的知道具体的子类(比如:现在面包吃腻了,需要牛奶,客户端就要做出修改),那么就发现整个代码,主类(客户端)最关注的是IFood(食物)本身,而非IFood(食物)的来历。对于客户端而言,无需知道子类的信息。
举例:扩展一类食物(强调客户端不关注IFood的来历,只关注IFood本身)
代码:
class Milk implements IFood { //Bread换成Milk public viod eat() {//boolean比较麻烦换成viod System.out,println(“喝牛奶。”);//上面改成牛奶,那么这里也要改成喝牛奶 } } public class JavaDemo { public static viod main(String args[]){ IFood food=new Milk();//那么这里也要改 food.eat(); //吃面包 } }
2.2耦合的定义
所以此时的程序就表示出现有耦合的问题,而造成耦合最直接的原因:“关键字new”。换言之“关键字new”提供的只是最原始对象的实例化处理,也是造成整个开发代码耦合的关键原因。
以JVM的设计为例,Java实现可移植性的关键在于JVM,JVM的核心原理是:利用一个虚拟机来运行Java程序,所有的程序与具体的操作系统没有任何关联,而是由JVM进行匹配。结论:良好的设计应该避免耦合。
举例:工厂设计实现
class Factory { public static IFood geiInstance(String className){ if (“bread”.equals(className)) { return new Bread(); }else if (“milk”.equals(className)){ return new Milk(); }else{ return null; } } } public class JavaDemo { public static viod main(String args[]){ IFood food= Factory .getInstance(args [0];//初始化参数 food.eat(); //吃面包 } }
代码执行结果如下:
得出结论:在本程序之中,客户端程序类与IFood接口的子类没有任何关联,所有的关联都是通过 Factory 类完成的,而在程序运行的时候可以通过初始化参数进行要使用的子类定义:
(1) Java JavaDemo bread
(2) Java JavaDemo milk
03.工厂设计
工厂设计的代码中,有两个不同的子类,主类与 Factory 有关,发现主类与子类无关,而整个程序代码中只需关注 Factory ,则 Factory 去关注子类,这样的设计叫工厂设计。如果子类需要进行扩充,只需要修改 Factory 程序类即可实现。