工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
案例:
1.首先声明一个接口,这也是为了使程序按照规定的业务来实现。
interface Cart{ //汽车
void start();
}
2.声明两个类实现Cart接口,让他们属于Cart类型
class BenChi implements Cart{
@Override
public void start() {
System.out.println("启动我的奔驰……");
}
}
class BaoMa implements Cart{
@Override
public void start() {
System.out.println("启动我的宝马……");
}
}
3.创建工厂类
class CartFactory{ //工厂类
public static Cart getMyCart(String cartName){
if(cartName==null||cartName==""){
return null;
}
switch (cartName){
case "benchi":
return new BenChi();
case "baoma":
return new BaoMa();
default:
return null;
}
}
}
4.测试:
public class CartTest {
public static void main(String[] args) {
Cart cart=CartFactory.getMyCart("benchi");
cart.start();
Cart cart1=CartFactory.getMyCart("baoma");
cart1.start();
}
}
结果如下:
工厂类中getMyCart()用来创建Cart类型的对象,将来只要想取得Cart类型的对象,只需调用
getMyCart(),里面传入规定的字符参数即可。走到这一步声明接口划分类的作用就出来了,如果没有Cart接口,其实代码也能实现,直接让工厂方法的返回类型为Object。在测试类中进行强制转换即可。代码如下
class BenChi{
public void start() {
System.out.println("启动我的奔驰……");
}
}
class BaoMa{
public void start() {
System.out.println("启动我的宝马……");
}
}
class CartFactory{ //工厂类
public static Object getMyCart(String cartName){
if(cartName==null||cartName==""){
return null;
}
switch (cartName){
case "benchi":
return new BenChi();
case "baoma":
return new BaoMa();
default:
return null;
}
}
}
public class CartTest {
public static void main(String[] args) {
BenChi benChi= (BenChi) CartFactory.getMyCart("benchi");
benChi.start();
BaoMa baoMa=(BaoMa)CartFactory.getMyCart("baoma");
baoMa.start();
}
}
结果如下:
可以看到,虽然效果相同,但是在设计方面却有着很大差别。第一种设计很清晰明确,因为有接口约束,相较于第二种方式而言,他比较灵活简单,且符合面向对象思想。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。