⼯⼚模式及在Spring中的应⽤
⼯⼚模式是最基本的也是最重要的模式,因为它⽅便我们能写出⾼质量、⾼效率的代码。只有掌握了⼯⼚模式,我们才不会重复造轮⼦。今天将从最简单的⼯⼚模式开始⼀步步深⼊讲解,告诉⼤家⾃⼰写是怎么⽤的,框架⼜是如何实现,我们能从框架实现获得怎么样的灵感。
⾸先看看⼯⼚模式的类图:
⼯⼚模式由⼀个接⼝类加⼀个对应的⼯⼚类实现的,接⼝类提供所有要创建出来的实体所需要的⽅法,⼯⼚类只负责⼀件事:创建实现类的对象的⽅法。
先提供出接⼝类和实现类:
public interface ICar {
void getBrand();
}
public class Audi implements ICar {
public void getBrand() {
System.out.printf("My brand is %s \n", SimpleName());
}
}
public class Benz implements ICar {
public void getBrand() {
System.out.printf("My brand is %s \n", SimpleName());
}
}
实现类会把类名打出来,我们现在要写个⼯⼚类负责构造实现类的对象。
if("audi".equals(carName)){
return  new Audi();
} else if ("benz".equals(carName)) {
return new Benz();
}
return null;
}
public static void main(String[] args) {
SimpleFactory1 carFactory = new SimpleFactory1();
ICar audi = ateCar("audi");
ICar benz = ateCar("benz");
}
}
⼯⼚类采⽤的是根据传⼊类型判断创建哪个实体类,这种⽅式是实现起来很简单,有⼏种类型就相应的写多个if...分⽀即可。但这种⼯⼚模式让⼈感觉很低能,因为每次需要增加⼀种类型的车辆,不仅要加相应的实体类,还要修改⼯⼚类,明显违背了开闭原则。现在提供第⼆种⼯⼚类:
public class SimpleFactory2 {
public ICar createCar(Class<? extends  ICar> carClass){
try {
wInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
SimpleFactory2 carFactory = new SimpleFactory2();
ICar audi = ateCar(Audi.class);
ICar benz = ateCar(Benz.class);
}
第⼆种⼯⼚类的实现是根据实体类的Class的类型来⾃动⽣成实例,这种⽅式极⼤了提升了程序的扩展性,后续⼯⼚类不需要做任何更改,只要加让实体类实现ICar接⼝,那么就能通过⼯⼚类⽣产出相应的车辆。
现在最热门的Spring框架的IOC就是基于⼯⼚模式,IOC通过DI(依赖注⼊)的⽅式将bean的创建交给了Spring Container,Spring Container ⾃动帮我们创建对象,我们只需要使⽤即可。
spring ioc注解下⾯将采⽤Spring提供的⼀些组件来实现⼀个简单⼯⼚,⾸先原有的实体类需要做下改造,类上加了@Component注解:
@Component
public class Audi implements ICar {
public void getBrand() {
System.out.printf("My brand is %s \n", SimpleName());
}
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.del");
return (ICar) Bean(carName);
}
public static void main(String[] args) {
SpringFactory springFactory = new SpringFactory();
ICar carBean = ateCar("audi");
}
}
Spring 这个⼯⼚和前⾯的两种实现⽅式有没有本质区别呢,必须有,毕竟Spring 这么强⼤的世界级框架能被成千上万的企业使⽤有其道理。前⾯已经提⽰了,Spring 框架有Spring 容器,Spring 容器在启动的时候已经创建了,所有被@Component注解标注的实体类都会被扫描到放⼊容器中,下次使⽤是直接从容器中取出对象,不会再new新的对象。
可见,理解设计模式⾮常重要,通过设计模式,我们才能更深⼊的理解各种框架,理解了框架本质和思想,才能利⽤框架写出⾼质量的代码。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。