工厂模式就是帮助调用创建对象的,实现了创建者和调用者的分离;
使用java原始创建对象的方式:
在类A 中要创建 类B的实例,以前我们使用
B b = new B();
此时类A和类B是直接产生关系了的(当这样的场景大量出现,彼此间关系会显得混乱,不好梳理)
工厂模式就是让创建者A 与 被创建者B 之间不再直接产生关系,而是通过“第三者”工厂间接的维持关系。
# 工厂模式分类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂模式(使用最多)
通常我们对于同一级别(大概就是类似的意思)的类对象,我们使用简单工厂模式来同一管理这些类的创建。
举例有两个类:Dog 和 Pig 它们有共性:都能跑 所以我们抽取出一个接口 : Animal 约束它们的行为
public interface Animal {
void run();
}
public class Dog() implements Animal {
@Override
public void run(){
//实现
}
}
public class Pig() implements Animal {
@Override
public void run(){
//实现
}
}
然后我们 创建一个AnimalFactory的工厂类:其中类型判断随意,根据不同类型,创建不同的类型,同一返回共同实现的接口类型,
public static Animal createAnimal(int type){
if(type == 1){
return new Dog();
}else if(type == 2){
return new Pig();
}
return null;
}
{
//调用者在创建时都不会与被创建对象直接产生关系,而是有创建工厂代替
//在有新的对象时,只需要修改工厂的结构即可
Animal anl1 = AnimalFactory.createAnimal(1); //创建狗
Animal anl1 = AnimalFactory.createAnimal(2); //创建猪
}
工厂方法模式
使用上面Dog 、 Pig 类 和 Animal接口,在工厂方法模式中,AnimalFactory 不再直接创建对象,而是定义成一个接口类约束工厂行为,然后分别创建Dog 和 Pig 对应的工厂类,同一实现接口
public interface AnimalFactory {
Animal createAnimal();
}
public class DogFactory implements AnimalFactory{
@Override
public Animal createAnimal() {
return new Dog();
}
}
public class PigFactory implements AnimalFactory{
@Override
public Animal createAnimal() {
return new Pig();
}
}
创建者在使用的时候只需要通过各自的工厂类来创建对象:
Animal anl1 = new DogFactory().createAnimal();
Animal anl2 = new PigFactory().createAnimal();
anl1.run();
anl2.run();
如果此时需要用到另一个Horse类,调用者只需要,创建一个对应的工厂类就可以完成创建,不会对原有代码做任何修改(OCP开闭原则)
抽象工厂模式
不怎么好解释,那天想到一个好的说法在补上吧。。。