java设计模式一创建型模式一抽象工厂模式

发布于:2022-12-16 ⋅ 阅读:(398) ⋅ 点赞:(0)

抽象工厂模式

基本介绍:
(1)抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类.
(2)抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
(3)从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象).
(4)将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类.程序员可以根据创建对象类型使用对应的工厂子类.这样将单个的简单工厂类变成工厂簇,更有利于代码的维护与扩展
(5)类图

请添加图片描述

老样子,先首先我们先建立Pizza类和Pizza子类:

Pizza类

public abstract class Pizza {

protected String name;

//准备原材料,不同的披萨不一样,因此,写成抽象方法
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;");
}

public void setName(String name) {
	this.name = name;
	}
}

Pizza子类

public class BJCheesePizza extends Pizza {

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


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


public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
	setName("伦敦的奶酪pizza");
	System.out.println("给伦敦的奶酪pizza 准备原材料");
	}
}


public class LDPepperPizza extends Pizza {
@Override
public void prepare() {
	setName("伦敦的胡椒pizza");
	System.out.println("给伦敦的胡椒pizza 准备原材料");
	}
}

然后建立抽象工厂类

父类
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
	 //让下面的工厂子类来具体实现
	public Pizza createPizza(String orderType);
}

子类

public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
    Pizza pizza = null;
    if ("cheese".equals(orderType)) {
        pizza = new BJCheesePizza();
    }else if("pepper".equals(orderType)){
        pizza = new BJPepperPizza();
    }
    return pizza;
	}
}

public class LDFactory implements AbsFactory{
@Override
public Pizza createPizza(String orderType) {
    Pizza pizza = null;
    if ("cheese".equals(orderType)) {
        pizza = new LDCheesePizza();
    }else if("pepper".equals(orderType)){
        pizza = new LDPepperPizza();
    }
    return pizza;
 }

}

建个实现订购披萨的类

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("订购失败");
        }
    }while (true);
}
//写一个方法,可以获取客户希望订购的披萨类型
private  String getType(){
    try{
        BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("input pizza 种类:");
        String str = strin.readLine();
        return str;
    }catch (IOException e){
        e.printStackTrace();
        return  "";
    }
 }
}

最后建一个测试类

public class PizzaStore {
public static void main(String[] args) {
    new OrderPizza(new LDFactory());
 }
}

运行结果如下:
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到