0
点赞
收藏
分享

微信扫一扫

4. 设计模式-工厂模式

白衣蓝剑冰魄 2022-02-19 阅读 46

工厂模式

一、披萨订购

1. pizza创建

  1. 抽象类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;
    }
}
  1. 奶酪披萨
public class CheesePizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给制作奶酪披萨,准备原材料");
    }
}
  1. 希腊披萨
public class GreekPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}

2. 订购

  1. 订购披萨
public class OrderPizza {
    //构造器
    public OrderPizza(){
        Pizza pizza = null;
        String orderType; // 订购披萨的类型
        do {
            orderType = getType();
            if(orderType.equals("greek")){
                pizza = new GreekPizza();
                pizza.setName(" 希腊披萨 ");
            }else if (orderType.equals("cheese")){
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披萨 ");
            }else if (orderType.equals("pepper")){
                pizza = new PepperPizza();
                pizza.setName("胡椒披萨");
            }
            else {
                break;
            }
            //输出披萨制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);

    }


    // 获取客户订购的披萨种类
    public 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 "";
        }
    }
}
  1. 客户端,发起订购披萨任务
// 客户端,发起订购披萨任务
public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza();
    }
}

二、简单工厂模式

1. 什么是简单工厂模式

  1. 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例
  2. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为
  3. 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

2. 使用简单工厂模式

  1. 创建工厂类
//简单工厂类
public class SimpleFactory {

    // 根据orderType,返回对应的Pizza 对象
    public Pizza createPizza(String orderType){
        System.out.println("使用简单工厂模式");

        Pizza pizza = null;

        if(orderType.equals("greek")){
            pizza = new GreekPizza();
            pizza.setName(" 希腊披萨 ");
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披萨 ");
        }else if (orderType.equals("pepper")){
            pizza = new PepperPizza();
            pizza.setName("胡椒披萨");
        }else {
            return null;
        }
        return pizza;
    }
}

  1. 改造订购类
public class OrderPizza {
    //定义一个简单工厂对象
    SimpleFactory simpleFactory;
    Pizza pizza = null;

    //构造器
    public OrderPizza(SimpleFactory simpleFactory){
        setSimpleFactory(simpleFactory);
    }

    public void setSimpleFactory(SimpleFactory simpleFactory){
        String orderType = ""; //用户输入

        this.simpleFactory = simpleFactory; //设置简单工厂对象

        do {
            orderType = getType();
            pizza = this.simpleFactory.createPizza(orderType);

            //输入pizza信息
            if (pizza != null){
                //输出披萨制作过程
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购披萨失败");
                break;
            }
        }while (true);
    }

    // 获取客户订购的披萨种类
    public 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 "";
        }
    }
}

  1. 客户端,发起订购披萨任务
// 客户端,发起订购披萨任务
public class PizzaStore {
    public static void main(String[] args) {
        //new OrderPizza();

        //使用简单工厂模式
        new OrderPizza(new SimpleFactory());
        System.out.println("--退出程序--");
    }
}

三、工厂方法模式

1. 模式介绍

  1. 将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
  2. 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类

2. 使用工厂方法模式

  1. 创建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;
    }
}
// 北京的奶酪披萨
public class BJCheesePizza extends Pizza{
    @Override
    public void prepare() {
        setName("北京的奶酪披萨");
        System.out.println("北京的奶酪披萨,准备原材料");
    }
}
// 北京的胡椒披萨
public class BJPepperPizza extends Pizza{
    @Override
    public void prepare() {
        setName("北京的胡椒披萨");
        System.out.println("北京的胡椒披萨,准备原材料");
    }
}
// 伦敦的奶酪披萨
public class LDCheesePizza extends Pizza{
    @Override
    public void prepare() {
        setName("伦敦的奶酪披萨");
        System.out.println("伦敦的奶酪披萨,准备原材料");
    }
}
// 伦敦的胡椒披萨
public class LDPepperPizza extends Pizza{
    @Override
    public void prepare() {
        setName("伦敦的胡椒披萨");
        System.out.println("伦敦的胡椒披萨,准备原材料");
    }
}
  1. 创建订购pizza的抽象类
public abstract class OrderPizza {

    //定义一个抽象方法,createPizza,让各个工厂子类自己实现
    abstract Pizza createPizza(String orderType);

    //构造器
    public OrderPizza() {
        Pizza pizza = null;
        String orderType; //订购披萨的类型
        do {
            orderType = getType();
            pizza = createPizza(orderType); // 抽象方法由工厂子类完成

            //输出pizza的制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();

        } while (true);
    }

    // 获取客户订购的披萨种类
    public 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 "";
        }
    }
}

  1. 实现订购pizza的抽象类
public class BJOrderPizza extends OrderPizza{

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

public class LDOrderPizza extends OrderPizza{
    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")){
            pizza = new LDCheesePizza();
        } else if (orderType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
  1. 测试类
// 客户端,发起订购披萨任务
public class PizzaStore {
    public static void main(String[] args) {
        //创建北京口味的各种披萨
        new BJOrderPizza();
    }
}

四、抽象工厂模式

1. 基本介绍

  1. 抽象工厂模式,定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
  2. 抽象工厂模式可以将简单工厂模式工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进
  4. 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。

2. 使用抽象工厂模式

  1. 披萨类
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;
    }
}
// 北京的奶酪披萨
public class BJCheesePizza extends Pizza {
    @Override
    public void prepare() {
        setName("北京的奶酪披萨");
        System.out.println("北京的奶酪披萨,准备原材料");
    }
}
// 北京的胡椒披萨
public class BJPepperPizza extends Pizza {
    @Override
    public void prepare() {
        setName("北京的胡椒披萨");
        System.out.println("北京的胡椒披萨,准备原材料");
    }
}
// 伦敦的奶酪披萨
public class LDCheesePizza extends Pizza {
    @Override
    public void prepare() {
        setName("伦敦的奶酪披萨");
        System.out.println("伦敦的奶酪披萨,准备原材料");
    }
}
// 伦敦的胡椒披萨
public class LDPepperPizza extends Pizza {
    @Override
    public void prepare() {
        setName("伦敦的胡椒披萨");
        System.out.println("伦敦的胡椒披萨,准备原材料");
    }
}
  1. 抽象工厂
// 抽象工厂模式的抽象层
public interface AbsFactory {

    // 让工厂子类具体实现
    public Pizza createPizza(String orderType);
}
  1. 抽象工厂的子类
// 工厂子类
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;
    }
}
// 工厂子类
public class LDFactory implements AbsFactory{
    @Override
    public Pizza createPizza(String orderType) {
        System.out.println("使用抽象工厂模式");
        Pizza pizza = null;
        if (orderType.equals("cheese")){
            pizza = new LDCheesePizza();
        } else if (orderType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}

  1. 订餐类
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();
            pizza = factory.createPizza(orderType);

            if (pizza != null){
                // 输出信息
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购失败");
                break;
            }

        } while (true);
    }

    // 获取客户订购的披萨种类
    public 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 "";
        }
    }
}

  1. 测试
// 客户端,发起订购披萨任务
public class PizzaStore {
    public static void main(String[] args) {
        //创建北京口味的各种披萨
        new OrderPizza(new BJFactory());
    }
}
举报

相关推荐

0 条评论