前言
如果对本篇文章表示看不懂,可以结合浅析工厂模式之工厂方法模式,浅析工厂模式之简单工厂模式,这两篇文章。
1抽象工厂模式简介:
1.1抽象工厂模式:
定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
1.2抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
1.3从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
1.4 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
2.UML类图
3.具体代码:
BJPearMilkTea类
public class BJPearMilkTea extends MilkTea {
@Override
public void prepare() {
// TODO Auto-generated method stub
setName("北京的珍珠奶茶");
System.out.println(" 北京的珍珠奶茶 准备原材料");
}
}
BJHerbalMilkTea类
public class BJHerbalMilkTea extends MilkTea {
@Override
public void prepare() {
// TODO Auto-generated method stub
setName("北京的香草奶茶");
System.out.println(" 北京的香草奶茶 准备原材料");
}
}
LDPearMilkTea类
public class LDPearMilkTea extends MilkTea {
@Override
public void prepare() {
// TODO Auto-generated method stub
setName("伦敦的珍珠奶茶");
System.out.println(" 伦敦的珍珠奶茶 准备原材料");
}
}
LDHerbalMilkTea类
public class LDHerbalMilkTea extends MilkTea {
@Override
public void prepare() {
// TODO Auto-generated method stub
setName("伦敦的珍珠奶茶");
System.out.println(" 伦敦的珍珠奶茶 准备原材料");
}
}
MilkTea类:
public abstract class MilkTea {
protected String name; //名字
//准备原材料, 不同的奶茶不一样,因此,我们做成抽象方法
public abstract void prepare();
public void water() {
System.out.println(name + " water;");
}
public void sealTheCup() {
System.out.println(name + " sealTheCup;");
}
public void setName(String name) {
this.name = name;
}
}
AbsFactory类
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
//让下面的工厂子类来 具体实现
public MilkTea createMilkTea(String orderType);
}
BJFactory类
//这是工厂子类
public class BJFactory implements AbsFactory {
@Override
public MilkTea createMilkTea(String orderType) {
System.out.println("~使用的是抽象工厂模式~");
// TODO Auto-generated method stub
MilkTea MilkTea = null;
if(orderType.equals("Pear)) {
MilkTea = new BJPearMilkTea();
} else if (orderType.equals("Herbal")) {
MilkTea = new BJHerbalMilkTea();
}
return MilkTea;
}
}
LDFactory类
public class LDFactory implements AbsFactory {
@Override
public MilkTea createMilkTea(String orderType) {
System.out.println("~使用的是抽象工厂模式~");
MilkTea MilkTea = null;
if(orderType.equals("Pear")) {
MilkTea = new LDPearMilkTea();
} else if (orderType.equals("Herbal")) {
MilkTea = new LDHerbalMilkTea();
}
return MilkTea;
}
}
OrderMilkTea类
public class OrderMilkTea {
AbsFactory factory;
// 构造器
public OrderMilkTea(AbsFactory factory) {
setFactory(factory);
}
private void setFactory(AbsFactory factory) {
MilkTea MilkTea = null;
String orderType = ""; // 用户输入
this.factory = factory;
do {
orderType = getType();
// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
MilkTea = factory.createPizza(orderType);
if (MilkTea != null) { // 订购ok
MilkTea.prepare();
MilkTea.water();
MilkTea.sealTheCup();
} else {
System.out.println("订购失败");
break;
}
} while (true);
}
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input MilkTea 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
MilkTeaStore类
public class MilkTeaStore {
public static void main(String[] args) {
// TODO Auto-generated method stub
//new OrderMilkTea(new BJFactory());
new OrderMilkTea(new LDFactory());
}
}
4.工厂模式小结
1.1工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
1.2三种工厂模式
(简单工厂模式、工厂方法模式、抽象工厂模式)
1.3设计模式的依赖抽象原则
创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
不要覆盖基类中已经实现的方法。