Android面试题--设计模式之静态工厂方法模式 工厂方法模式 抽象工厂模式实现

版权声明:本文为博主原创文章,转载请标明出处!如果文章有错误之处请留言。 https://blog.csdn.net/qq_30993595/article/details/89097070

定义

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类

工厂模式分类

简单工厂模式

该模式又称为静态工厂方法模式,这种模式比较简单,在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);
    }
}

适用场景:系统提供一个产品类的库,所有的产品以相同的接口出现,从而使客户端不依赖于实现

工厂模式可以帮助我们针对抽象类/接口编程,而不是针对具体类编程,在不同的场景下按具体情况来使用,充分利用面向对象的多态性

猜你喜欢

转载自blog.csdn.net/qq_30993595/article/details/89097070