简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类
package com.sunny.project;
/**
* 发型接口
* @author Administrator
*
*/
public interface HairInterface {
/**
* 画图
*/
public void draw();
}
package com.sunny.project;
/**
* 右偏分发型
* @author Administrator
*
*/
public class RightHair implements HairInterface {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("-----------------右偏分发型-------------------");
}
}
工厂,能生产所有发型
package com.sunny.project;
import java.util.Map;
/**
* 发型工厂
* @author Administrator
*
*/
public class HairFactory {
/**
* 根据类的名称来生产对象
* @param className
* @return
*/
public HairInterface getHairByClass(String className){
try {
HairInterface hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
调用的时候,我们可以
HairFactory factory = new HairFactory();
HairInterface left = factory.getHairByClass("com.sunny.project.LeftHair");
left.draw();
创建一个工厂对象,然后把类名放进去,之后调用方法。如果你还有新的发型,就可以简单创建一个发型即可。
符合工厂的定义提供一个创建对象实例的功能。
抽象工厂
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
如果按坐标轴来看,工厂是横坐标,抽象工厂是轴坐标
这是一个工厂
package com.sunny.project;
/**
* 男孩
* @author Administrator
*
*/
public interface Boy {
public void drawMan();
}
package com.sunny.project;
/**
* Х?К?зг
* @author Administrator
*
*/
public interface Girl {
public void drawWomen();
}
package com.sunny.project;
/**
* 人物的实现接口
* @author Administrator
*
*/
public interface PersonFactory {
//男孩接口
public Boy getBoy();
//女孩接口
public Girl getGirl();
}
package com.sunny.project;
/**
* 新年系列的男孩子
* @author Administrator
*
*/
public class HNBoy implements Boy {
@Override
public void drawMan() {
// TODO Auto-generated method stub
System.out.println("-----------------新年系列的男孩子--------------------");
}
}
package com.sunny.project;
/**
* 新年系列的女孩子
* @author Administrator
*
*/
public class HNGirl implements Girl {
@Override
public void drawWomen() {
// TODO Auto-generated method stub
System.out.println("-----------------新年系列的女孩子--------------------");
}
}
package com.sunny.project;
/**
* 新年系列加工厂
* @author Administrator
*
*/
public class HNFactory implements PersonFactory {
@Override
public Boy getBoy() {
// TODO Auto-generated method stub
return new HNBoy();
}
@Override
public Girl getGirl() {
// TODO Auto-generated method stub
return new HNGirl();
}
}
这个工厂中的男孩和女孩实现了前面一个工厂的男孩和女孩
调用
PersonFactory facoty = new PersonFactory();
Girl girl = facoty.getGirl();
girl.drawWomen();
PersonFactory facoty = new HNFactory();
Boy boy = facoty.getBoy();
boy.drawMan();
可以看到声明的工厂是PersonFactory 而new 的工厂可以是其他的工厂。
当我们要加系列的时候,只要创建实现PersonFactory这个工厂的工厂就可以了