一、抽象工厂模式介绍
抽象工厂模式是定义了一个interface用于创建相关或有依赖关系的对象蔟,而无需知道具体的类。它将工厂抽象成两层,AbsFactory(抽象工厂)和具体的实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个简单工厂类变成了工厂蔟,更利于代码的维护和发展。
抽象工厂模式可以将简单工厂模式或工厂方法模式整合,从设计层面看,抽象工厂模式就是简单工厂模式的改进(或者称为进一步的抽象)。
二、抽象工厂模式例子
使用抽象工厂模式完成披萨项目,类图如下:
代码如下:
1)创建Pizza类及其子类
public abstract class Pizza{
private String name;
public void setName(String name){
this.name = name;
}
//准备原材料,不同的披萨所需的原材料不一样,因此做成抽象方法
public abstract void prepare();
public void bake(){
System.out.println(name + " is backing...");
}
public void cut(){
System.out.println(name + " is cutting...");
}
public void box(){
System.out.println(name + " is boxing...");
}
}
public class BJCheesePizza extends Pizza{
public void prepare(){
System.out.println("北京奶酪披萨准备原材料中...");
}
}
public class BJPepperPizza extends Pizza{
public void prepare(){
System.out.println("北京胡椒披萨准备原材料中...");
}
}
public class LDCheesePizza extends Pizza{
public void prepare(){
System.out.println("伦敦奶酪披萨准备原材料中...");
}
}
public class LDPepperPizza extends Pizza{
public void prepare(){
System.out.println("伦敦胡椒披萨准备原材料中...");
}
}
2)创建抽象的工厂类及其相应的子类
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory{
//让工厂子类来具体实现
Pizza createPizza(String type);
}
public class BJFacotry implements AbsFactory{
public Pizza createPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){
pizza = new BJCheesePizza();
} else if("pepper".equals(type)){
pizza = new BJPepperPizza();
}
return pizza;
}
}
public class LDFacotry implements AbsFactory{
public Pizza createPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){
pizza = new LDCheesePizza();
} else if("pepper".equals(type)){
pizza = new LDPepperPizza();
}
return pizza;
}
}
3)创建披萨订单类
public class OrderPizza{
private AbsFactory factory;
public OrderPizza(AbsFactory factory){
this.factory = factory;
}
public void orderPizza(){
Pizza pizza = null;
String type;
do{
type = getType();
pizza = factory.createPizza(type);
if(pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购失败....");
break;
}
} while(true);
}
//获取客户希望订购的披萨种类
private String getType(){
try{
BufferReader reader = new BufferReader(new InputStreamReader(System.in));
System.out.print("input pizza type:");
String type = reader.readLine();
return type;
} catch(IOException e){
return "";
}
}
}
三、工厂模式小结
1)工厂模式意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性
2)三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
3)设计模式的依赖抽象原则
- 创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中并返回。有的书上说是变量不要直接持有具体类的引用。
- 不要让类继承具体类,而是继承抽象类或者是实现interface
- 不要覆盖基类中已经实现的方法