简单工厂模式(又名:静态工厂方法模式):
定义:
-
由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
-
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
-
父类定义了创建对象的接口,但是由子类来具体实现,工厂方法让类把实例化的动作推迟到了子类当中,对象的创建由子类来完成。
作用:
实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。
使用场景:对某一类对象总是要执行相同的流程,但是并不在意这些对象之间的微小差异。
场景对应:公共的父类决定了怎么去处理这一类对象,而子类决定了如何创建这些有着微小差异的不同对象。
简单工厂模式例子:
1、抽象产品类(为子类提供方法)
public abstract class Animal{
//抽象方法,具体实现让子类去实现
public abstract void eat();
}
2、具体实现类
public class Cat extends Animal{
@Override
public void start() {
System.out.println("我要吃猫粮");
}
}
public class Dog extends Animal{
@Override
public void start() {
System.out.println("我要吃狗粮");
}
}
3、工厂类
public class AnimalFactory {
public static Animal createAnimal(String type){
Animal animal = null;
switch (type) {
case "cat":
animal = new Cat();
break;
case "dog":
animal = new Dog();
break;
}
return animal ;
}
}
4、客户端
public class CreatAnimal {
public static void main(String[]args){
AnimalFactory.createAnimal("dog").start();
}
}
缺点:你看工厂类,你应该就知道缺点在哪里了,不做过多名词性解释。
注意事项:
工厂模式分三种:简单工厂模式、工厂模式、抽象工厂模式,简单工厂模式只是其中一种。
网上很多人把简单工厂模式和工厂模式给混淆了,这里需要给出区分:简单工厂模式,通过参数。工厂模式,通过继承。
spring中的例子:
-
BeanFactory:根据传入一个唯一的标识来获得bean对象。
- BeanFactory的实现原理:
- 第一步:spring中配置的bean会被注册到BeanFactory中,BeanFactory会将bean存到concurrenthashmap中。
- 第二步:通过反射或者CGLIB去实例化bean。
BeanFactory和FactoryBean的区别:BeanFactory不解释了,FactoryBean就是一个能生产或修饰对象生成的工厂Bean,类似于设计模式中的工厂模式和装饰器模式。它能在需要的时候生产一个对象,且不仅仅限于它自身,它能返回任何Bean的实例。
jdk1.7、1.8、1.9不同版本中接口和抽象类的区别及用法
接口:一个类可以实现多个接口,该子类如果不是抽象类,那么实现了接口就必须重写接口中全部方法。
jdk1.7的接口:
- 接口中的方法都会默认加上 abstract 进行修饰成抽象方法,不能用static进行修饰。
- 接口中的常量都要加上 static final进行修饰,固接口没有变量,只能定义常量。
- 接口中没有构造方法,不能进行实例化对象。
jdk1.8的接口:
- 接口里可以有方法体,方法可以用static、default进行修饰。
- 静态方法可以直接通过接口名加“.”进行方法调用,不能通过接口实现类对象来调用接口静态方法。
- 默认方法能够解决接口如果添加抽象方法,而实现类不去重写的话会报错这个问题。
- 实现类实现接口中的默认方法,可以选择不进行重写,保持接口中的默认方法体,如果要重写,会覆盖原本的实现。
- 实现类对象可以调用自己重写的方法,也可以调用接口的默认方法。
- 如果实现类重写实现了接口默认方法,那么调用的就是实现的方法。
jdk1.9的接口:
- 接口可以定义私有方法。
- 普通私有方法:接口中如果多个默认方法出现了重复的代码,我们喜欢抽取到私有方法里面,就是这个用法。
- 私有静态方法:和上面一样,只不过这里解决的是静态方法的重复代码问题。
注意事项: