工厂模式
Spring IOC就是使用了工厂模式,对象的创建交给一个工厂去创建。
概念:工厂模式(Factory Pattern)使用一个共同的接口指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类
主要解决:解决接口的选择问题
何时使用:不同条件创建不同实例时
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品
关键点:创建过程在其子类执行
应用实例:当你需要一辆汽车,可以直接去工厂提货,而不用管这辆车是怎们做出来的,以及汽车里面的具体实现
优点:
1.调用者创建对象,只要知道其名称就可以了
2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
3.屏蔽产品的具体实现,调用者只关心产品的接口
缺点:
每次增加一个产品时,都要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
使用场景:
1.日志记录器:用户可以选择日志记录到本地硬盘、系统事件、远程服务器等
2.数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时
3.创建一个对象需要消耗的资源过多,比如I/O与数据库的连接等
实现
package factory;
/*
水果
*/
public interface Fruit {
void eat();
}
package factory;
/*
创建一个实现接口的实体类
*/
public class Apple implements Fruit{
@Override
public void eat() {
System.out.println("吃苹果!");
}
}
package factory;
/*
创建一个实现接口的实体类
*/
public class Banana implements Fruit {
@Override
public void eat() {
System.out.println("吃香蕉!");
}
}
package factory;
/*
创建工厂类,生成对象
*/
public class Factoty {
public static Fruit getFruit(String fruitName) {
Fruit fruit = null;
if(fruitName.equals("apple")){
fruit = new Apple();
} else if(fruitName.equals("banana")){
fruit = new Banana();
}
return fruit;
}
}
package factory;
/*
测试类
*/
public class Test {
public static void main(String[] args) {
//如果更换需求
Fruit fruit = Factoty.getFruit("apple"); //工厂类
eatFruit(fruit);
System.out.println("Over");
}
public static void eatFruit(Fruit fruit){
if(fruit != null){
fruit.eat();
}
}
}