什么是工厂模式
简介
工厂模式(Factory Pattern)是 Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
比如当我们想用多种数据源,mysql,sqlserver等等时,我们就可以用工厂模式方便的切换实现。或者我们在对一个接口有多种实现时,我们就可以使用工厂模式来动态干干净净的选择我们需要的实现方式来完成我们的业务功能,这里我使用复仇者的例子,来大概模拟一下具体是怎么实现的。这次请到钢铁侠,蜘蛛侠,和雷神同志出来帮一下忙。
一:定义一个公共接口Avenger
因为我们到最后都是要用一个接口来接收我们不同的实现类的,所以这里我们定义一个复仇者Avenger接口,我们给接口定义一个超级能力的方法,供给具体的英雄们去发挥。
public interface Avenger {
void superPowers();
}
二:定义不同的英雄实现相应的接口
首先是钢铁侠
public class IronMan implements Avenger {
@Override
public void superPowers() {
System.out.println("超能力?钞能力!");
}
}
再就是蜘蛛侠
public class SpiderMan implements Avenger{
@Override
public void superPowers() {
System.out.println("飞檐走壁,吐丝。");
}
}
再就是雷神
ublic class Thor implements Avenger {
@Override
public void superPowers() {
System.out.println("雷神之锤,发闪电!");
}
}
三:我们需要定义一个类似工具类AvengerFactory复仇者工厂来动态生成超级英雄
当我们需要使用某种实现类时,我们只需要调用里面的getAvenger并传入对应的英雄名称就可以得到对应的示例。
public class AvengerFactory {
public Avenger getAvenger(String avengerType) {
if (avengerType == null) {
return null;
} else if (avengerType.equalsIgnoreCase("IRONMAM")) {//equalsIgnoreCase忽略大小写
return new IronMan();
} else if (avengerType.equalsIgnoreCase("SPIDERMAN")) {
return new SpiderMan();
} else if (avengerType.equalsIgnoreCase("THOR")) {
return new Thor();
}
return null;
// switch (avengerType) {//jdk7后也可以用switch来代替if else
// case "IRONMAM":
// return new IronMan();
// case "SPIDERMAN":
// return new SpiderMan();
// case "THOR":
// return new Thor();
// default:
// return null;
// }
}
}
测试
public class Test {
public static void main(String[] args) {
AvengerFactory avengerFactory = new AvengerFactory();
Avenger avenger1 = avengerFactory.getAvenger("IRONMAM");
avenger1.superPowers();
Avenger avenger2 = avengerFactory.getAvenger("SPIDERMAN");
avenger2.superPowers();
Avenger avenger3 = avengerFactory.getAvenger("THOR");
avenger3.superPowers();
}
}
总结
工厂模式是一个很实用的设计模式,无论是在开发大型的项目或者是在阅读源码时,都是非常重要的,它能够让我们的代码变的整洁,逻辑清楚,就像我们想吃不同的口味的辣条的时候,我们不用管它是飞旺还是卫龙,我们只需要一个机器,告诉他你想要什么,他就会给你什么,很干净,很方便。
如果本文对你有帮助,请给我一个赞哦。
日月还长,加油后浪!