工厂模式相当于创建对象的new。如A a=new A(). 工厂模式也是用来创建实例对象的,但它是面向接口编程,提高了代码的扩展性和维护性。
例:这两天我太累了,想去按摩店按摩。每位技师都有不同的特长,我只需要告诉她我要什么服务,她就能帮忙实现,而不需要管具体是哪位技师。
//创建对象的接口
public interface Massage {
//需要按摩服务
public void massagist();
}
//工厂1
class Massage1 implements Massage{
@Override
public void massagist() {
System.out.println("7号技师为您泰式足底按摩90分钟");
}
}
//工厂2
class Massage2 implements Massage{
@Override
public void massagist() {
System.out.println("13号技师为您精油推背90分钟");
}
}
//工厂3
class Massage3 implements Massage{
@Override
public void massagist() {
System.out.println("27号技师为你前列腺按摩120分钟");
}
}
测试类:
//测试类
public class Test {
public static void main(String[] args) {
Massage m1 = new Massage1();
m1.massagist();
Massage m2 = new Massage2();
m2.massagist();
Massage m3 = new Massage3();
m3.massagist();
}
}
=========================
【控制台输出】
7号技师为您泰式足底按摩90分钟
13号技师为您精油推背90分钟
27号技师为你前列腺按摩120分钟
spring中工厂模式的实现
// 创建bean工厂
public interface BeanFactory {
Object getBean(String id) throws ExecutionException;
}
// Bean工厂的实现类
public class ClassPathXmlApplicationContext implements BeanFactory {
private Map<String, Object> map = new HashMap<String, Object>();
@SuppressWarnings("unchecked")
public ClassPathXmlApplicationContext(String fileName) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException {
//加载配置文件
SAXReader reader = new SAXReader();
Document document = reader.read(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(fileName));
//获取根节点
Element root = document.getRootElement();
//获取子节点
List<Element> childElements = root.elements();
for (Element element : childElements) {
map.put(element.attributeValue("id"), Class.forName(element.attributeValue("class")).newInstance());
}
}
@Override
public Object getBean(String id) throws ExecutionException {
return map.get(id);
}
}