抽象工厂模式

一、抽象工厂模式介绍

       抽象工厂模式是定义了一个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
  • 不要覆盖基类中已经实现的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值