这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能照工厂模式提供对象。
优点:
客户端只能在工厂中选择一个对象。保证了代码的健壮性。
缺点:
增加代码的复杂度。
类图:
创建一个接口Milk.java:
public interface Milk {
String getName();
}
实现接口的实体类:
Telunsu.java
public class Telusu implements Milk {
@Override
public String getName() {
return "特仑苏";
}
}
Mengniu.java
public class Mengniu implements Milk {
@Override
public String getName() {
return "蒙牛";
}
}
Yili.java
public class Yili implements Milk {
@Override
public String getName() {
return "伊利";
}
}
创建抽象工厂:
AbstractMilkFactory.java
public abstract class AbstractMilkFactory {
/**
* 获得蒙牛牛奶
* @return milk
*/
public abstract Milk getMengniu();
/**
* 获取伊利牛奶
* @return
*/
public abstract Milk getYili();
/**
* 获取特仑苏牛奶
* @return
*/
public abstract Milk getTelunsu();
}
抽象工厂实现:
MilkFactory.java
public class MilkFactory extends AbstractMilkFactory {
@Override
public Milk getMengniu() {
return new Mengniu();
}
@Override
public Milk getYili() {
return new Yili();
}
@Override
public Milk getTelunsu() {
return new Telusu();
}
}
测试:
AbstractFactoryTest.java
public static void main(String[] args) {
MilkFactory milkFactory = new MilkFactory();
//获取蒙牛牛奶
Milk mengniu = milkFactory.getMengniu();
System.out.println(mengniu.getName());
//获取伊利牛奶
Milk yili = milkFactory.getYili();
System.out.println(yili.getName());
//获取特仑苏牛奶
Milk telunsu = milkFactory.getTelunsu();
System.out.println(telunsu.getName());
}
输出:
获取的牛奶是:蒙牛
获取的牛奶是:伊利
获取的牛奶是:特仑苏