工厂模式是一种创建型设计模式。定义一个用与创建对象的接口,让子类实现决定创建哪一个类,使类的实例化延迟到它的子类。工厂模式的模型角色:
- 1.抽象工厂:模式核心,所有具体工厂都要实现这个接口。包含创建同种类别产品的方法
- 2.具体工厂:实现抽象工厂,根据具体需要创建具体产品对象。
- 3.抽象产品:定义产品的共性。
- 4.具体产品:具体的产品,拥有所有产品的共性,也拥有自己的特性。
以去饮料店买的饮料作为例子,抽象一个饮料工厂,包含生成饮料的方法:
public interface DrinksFactory {
public Drinks build();
}
抽象产品:
public abstract class Drinks {
public String doSing() {
return "水, " + "糖, ";
}
public abstract String otherDoSing();
public void make() {
Log.d("制作配方", doSing() + otherDoSing());
}
}
所有的饮料都包含水,糖,是共性;又拥有独特的配料,是为特性。
具体产品:
public class AppleDrinks extends Drinks {
@Override
public String otherDoSing() {
return "苹果汁";
}
}
public class LemonDrinks extends Drinks{
@Override
public String otherDoSing() {
return "柠檬汁";
}
}
具体工厂:
public class AppleFactory implements DrinksFactory {
@Override
public Drinks build() {
return new AppleDrinks();
}
}
public class LemonFactory implements DrinksFactory {
@Override
public Drinks build() {
return new LemonDrinks();
}
}
使用:
DrinksFactory factory = new AppleFactory();
Drinks drinks = factory.build();
DrinksFactory factory2 = new LemonFactory();
Drinks drinks2 = factory2.build();
drinks.make();
drinks2.make();
结果:
D/制作配方: 水, 糖, 苹果汁
D/制作配方: 水, 糖, 柠檬汁
工厂模式特点:
- 优点:结构清晰,良好的封装性。创建对象不需要知道对象的具体,只需要知道对应的工厂即可。甚至还可以将创建对象修改为使用反射创建,封装性更加良好;可拓展性强。需要增加产品时增加相应的工厂就可以满足需求;解耦。高层模块只需要知道产品的抽象类,它的具体类都不用关心。
- 缺点:创建产品数量的增多可能会导致工厂类增多,增加代码量,加深代码复杂度。