定义
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类
工厂模式分类
简单工厂模式
该模式又称为静态工厂方法模式,这种模式比较简单,在Android开发中,创建过Bitmap的同学肯定知道BitmapFactory这个工厂类,它就是属于这一类;
原理就是定义一个类来负责其它类的实例化,被创建的实例通常有共同的父类或者实现了同一个接口
这里就定义一个接口,方便起见,接口里就不定义方法了:
public interface Animal {
}
接下来定义两个类去实现接口
public class Cat implements Animal {
private String fish;
public Cat(String fish) {
this.fish = fish;
}
}
public class Dog implements Animal {
private String bone;
public Dog(String bone) {
this.bone = bone;
}
}
接下来创建工厂类提供静态方法用于创建实例
public class AnimalFactory {
public static Animal CreateCat(String fish){
return new Cat(fish);
}
public static Animal CreateDog(String bone){
return new Dog(bone);
}
}
适用场景:这种工厂类负责创建的对象一般较少,创建者只需知道传入工厂类的参数,对于创建细节不需要关心
工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类;在该模式中,核心工厂类不再负责所有产品创建,只是定义创建对象的方法,将具体任务交给子类去做
这里以创建上面的Cat对象为例,提供一个接口,并给出两个实现类(毕竟有中国猫,也有美国猫啊)
public interface CatFactory {
Cat createFactory(String fish);
}
public class ChinaCatFactory implements CatFactory {
@Override
public Cat createFactory(String fish) {
return new Cat(fish);
}
}
public class AmericaCatFactory implements CatFactory {
@Override
public Cat createFactory(String fish) {
return new Cat(fish);
}
}
这里严谨点写,应该再写一个cat抽象类,然后定义一个中国猫一个美国猫两个类,这样就能对应这两个工厂类了
适用场景:客户端只需要知道创建具体产品的工厂类,而不需要了解产品名称等细节
但是这会带来一个问题:每增加一个产品,就需要编写新的产品类的同时还要编写对应的工厂类,比如这里多了一个非洲猫,德国猫等,那就得继续新增对应的工厂类,导致类数量大量增加
抽象工厂模式
提供一个创建一系列或相互依赖的对象的接口,而无需指定它们的具体类
像上面说了,猫有很多品种,比如橘猫,美短猫,布偶猫等,如果像上面那种模式,就需要新增三个工厂类,但是这里就不用了,只需要一个接口,还是两个创建猫的工厂类(中国猫工厂,美国猫工厂)
public interface CatFactory {
Cat createOrangeCat(String fish);
Cat createAmericaCat(String fish);
Cat createPuppetCat(String fish);
}
//中国猫工厂只创建橘猫
public class ChinaCatFactory implements CatFactory {
@Override
public Cat createOrangeCat(String fish) {
return new Cat(fish);
}
@Override
public Cat createAmericaCat(String fish) {
return null;
}
@Override
public Cat createPuppetCat(String fish) {
return null;
}
}
//美国猫工厂只创建布偶猫和美短猫
public class AmericaCatFactory implements CatFactory {
@Override
public Cat createOrangeCat(String fish) {
return null;
}
@Override
public Cat createAmericaCat(String fish) {
return new Cat(fish);
}
@Override
public Cat createPuppetCat(String fish) {
return new Cat(fish);
}
}
适用场景:系统提供一个产品类的库,所有的产品以相同的接口出现,从而使客户端不依赖于实现
工厂模式可以帮助我们针对抽象类/接口编程,而不是针对具体类编程,在不同的场景下按具体情况来使用,充分利用面向对象的多态性