java设计模式之抽象工厂模式

前言

什么是抽象工厂?

简介:

  • 定义了一个interface用于创建相关或有依赖关系的对象簇,并且无需指明具体的类。
  • 它可以将简单工厂模式和工厂方法模式进行整合。
  • 将工厂抽象成两层,抽象工厂(本文中的AbsFactory接口)和具体实现的工厂子类(BJFactory类和TJFactory类)
    java设计模式之抽象工厂模式_第1张图片
    Pizza类
//抽象类Pizza
public abstract class Pizza {

    //pizza的名字,具体的pizza
    protected String name;
    //准备原材料,不同的pizza原材料不同,所以设置成抽象方法
    public abstract void prepare();
    //烘烤
    public void bake(){
        System.out.println(name+"baking;");
    }
    //切割
    public void cut(){
        System.out.println(name+"cutting;");
    }
    //打包
    public void box(){
        System.out.println(name+"boxing;");
    }
    //将pizza的名字设置进去
    public void setName(String name){
        this.name=name;
    }
}

TJCheesePizza类

public class TJCheesePizza extends Pizza {

    @Override
    public void prepare() {
        setName("天津奶酪pizza");
        System.out.println("天津的奶酪pizza准备原材料!");
    }
}

TJPepperPizza类

public class TJPapperPizza extends Pizza {

    @Override
    public void prepare() {
        setName("天津胡椒pizza");
        System.out.println("天津的胡椒pizza准备原材料!");
    }
}

BJCheesePizza类

public class BJCheesePizza extends Pizza {

    @Override
    public void prepare() {
        setName("北京奶酪pizza");
        System.out.println("北京的奶酪pizza准备原材料!");
    }
}

BJPepperPizza类

public class BJPepperPizza extends Pizza {

    @Override
    public void prepare() {
        setName("北京胡椒pizza");
        System.out.println("北京的胡椒pizza准备原材料!");
    }
}

AbsFactory接口

//一个抽象工厂模式的抽象层(接口层)
public interface AbsFactory {

    //让下面的工厂子类来具体实现
    public Pizza createPizza(String orderType);
}

TJFactory类

//这是一个工厂子类
public class TJFactory implements AbsFactory{

    @Override
    public Pizza createPizza(String orderType) {
        System.out.println("使用的是抽象工厂模式!");
        Pizza pizza=null;
        if(orderType.equals("cheese")){
            pizza=new TJCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza=new TJPapperPizza();
        }
        return pizza;
    }
}

BJFactory类

//这是工厂子类
public class BJFactory implements AbsFactory {

    @Override
    public Pizza createPizza(String orderType) {
        System.out.println("使用的是抽象工厂模式!");
        Pizza pizza=null;
        if(orderType.equals("cheese")){
            pizza=new BJCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza=new BJPepperPizza();
        }
        return pizza;
    }
}

OrderPizza类

public class OrderPizza {

    AbsFactory factory;

    //构造器
    public OrderPizza(AbsFactory factory){
        setFactory(factory);
    }

    private void setFactory(AbsFactory factory){
        Pizza pizza=null;
        String orderType="";//用户输入
        this.factory=factory;

        do{
            orderType=getType();
            //factory可能是北京的工厂子类,也可能是天津的工厂子类
            pizza=factory.createPizza(orderType);
            if(pizza!=null){//订购完成
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else{
                System.out.println("订购失败,没有这个口味!");
                break;
            }
        }while(true);
    }

    //此方法可以获取客户希望订购的pizza种类
    private String getType(){
        try {
            BufferedReader strin=new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza type(种类):");
            String str=strin.readLine();
            return  str;
        }catch (IOException e){
            e.printStackTrace();
            return "";
        }
    }
}

PizzaStore类

public class PizzaStore {

    public static void main(String[] args) {
        //天津工厂相关的pizza订购
        new OrderPizza(new TJFactory());
    }
}

你可能感兴趣的:(【Java】)