工厂设计模式(Factory)
对于接口而言,已经可以明确的清楚,必须有子类,并且子类可以通过对象的向上转型来获取接口的实例化对象。但是在进行对象实例化过程之中也有可能存在有设计问题。
范例:观察如下一个程序
class JavaDemo
{
public static void main(String[] args)
{
IFood food = new Bread();
food.eat();//吃面包
}
}
interface IFood{ //定义一个食物的标准
public boolean eat(); //吃
}
class Bread implements IFood //定义一种食物(面包)
{
public boolean eat(){
System.out.println("吃面包");
return true;
}
}
结果:
在本程序之中根据接口进行子类的定义,并且利用对象的向上转型进行接口对象实例化处理,此时程序的结构如下:
客户端需要明确知道具体的哪一个子类,如果现在面包吃腻了,需要牛奶了,那么客户端就要做出修改,它只关心食物本身,而不关心食物来源。
范例:扩展一类食物
class JavaDemo
{
public static void main(String[] args)
{
IFood food = new Milk();
food.eat();//吃面包
}
}
interface IFood{ //定义一个食物的标准
public boolean eat(); //吃
}
class Bread implements IFood //定义一种食物(面包)
{
public boolean eat(){
System.out.println("吃面包");
return true;
}
}
class Milk implements IFood //新增一种食物(牛奶)
{
public boolean eat(){
System.out.println("喝牛奶");
return true;
}
}
此时的程序就出现了耦合(耦合是指两个或两个以上的电路元件或电网络的输入与输出之间存在紧密配合与相互影响,并通过相互作用从一侧向另一侧传输能量的现象;概括的说耦合就是指两个实体相互依赖于对方的一个量度.)的问题,而造成耦合最直接的元凶:“关键字new”。
以JVM的设计为例,java实现可移植性的关键在于:JVM,而JVM的核心原理:利用一个虚拟机来运行java程序,所有的程序并不与具体的操作系统有任何的关联,而是由JVM来进行匹配,所以得出的结论:良好的设计应该避免耦合。
范例:工厂设计实现
class JavaDemo
{
public static void main(String[] args)
{
IFood food = Factory.getInstance(args[0]); //初始化参数(从控制面板直接输入args参数)
food.eat();//吃面包
}
}
interface IFood{ //定义一个食物的标准
public boolean eat(); //吃
}
class Bread implements IFood //定义一种食物(面包)
{
public boolean eat(){
System.out.println("吃面包");
return true;
}
}
class Milk implements IFood //新增一种食物(牛奶)
{
public boolean eat(){
System.out.println("喝牛奶");
return true;
}
}
class Factory
{
public static IFood getInstance(String className){
if("Bread".equals(className)){
return new Bread();
}else if ("Milk".equals(className))
{
return new Milk();
}else{
return null;
}
}
}
结果:
在本程序之中,客户端程序类与IFood接口的子类没有任何的关联,所有关联都是通过Factory类完成的,而程序运行的时候可以通过初始化参数进行要是用的子类定义:
- java JavaDemo Milk
- java JavaDemo Bread
如果在日后进行子类扩充的时候只需要修改Factory程序类即即可实现。