普通工厂:
含义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。对同一个接口的实现类进行管理和实例化创建。
假设我们有这样一个需求:
动物Animal
,它有行为move()
。有两个实现类cat
和dog
。为了统一管理和创建我们设计一个工厂模式。 同时两个子类有各自的行为,Cat
有eatFish()
,Dog
有eatBone()
.
public interface Animal {
void move();
}
public class Cat implements Animal {
@Override
public void move() {
System.out.println("我是只肥猫,不爱动");
}
public void eatFish() {
System.out.println("爱吃鱼");
}
}
public class Dog implements Animal {
@Override
public void move() {
System.out.println("我是狗,跑的快");
}
public void eatBone() {
System.out.println("爱吃骨头");
}
}
public class Factory {
public static Cat produceCat() {
return new Cat();
}
public static Dog produceDog() {
return new Dog();
}
}
使用:
Animal cat = Factory.produceCat();
cat.move();
Dog dog = Factory.produceDog();
dog.eatBone();
dog.move();
工厂模式在业界运用十分广泛,如果都用new来生成对象,随着项目的扩展,animal
还可以生出许多其他儿子来,当然儿子还有儿子,同时也避免不了对以前代码的修改(比如加入后来生出儿子的实例),怎么管理,想着就是一团糟。
Animal cat = Factory.produceCat();
这里实例化了Animal但不涉及到Animal的具体子类(减少了它们之间的偶合联系性),达到封装效果,也就减少错误修改的机会。
一般来说,这样的普通工厂就可以满足基本需求。但是我们如果要新增一个Animal
的实现类panda
,那么必然要在工厂类里新增了一个生产panda
的方法。就违背了 闭包的设计原则(对扩展要开放对修改要关闭) ,于是有了抽象工厂模式。
抽象工厂:
含义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 啥意思?就是把生产抽象成一个接口,每个实例类都对应一个工厂类(普通工厂只有一个工厂类),同时所有工厂类都继承这个生产接口。
public interface Provider {
Animal produce();
}
public class CatFactory implements Provider {
@Override
public Animal produce() {
return new Cat();
}
}
使用:
Provider catFactory = new CatFactory();
Animal cat = catFactory.produce();
cat.move();
现在我们要加入panda
,直接新建一个pandaFactory
就行了,这样我们系统就非常灵活,具备了动态扩展功能。
Android中的Factory:AsyncTask
、BitmapFactory
网友评论