Java工厂模式

一、工厂模式定义介绍

二、工厂模式的分类

  1. 传统模式
  2. 简单工厂模式
  3. 工厂方法模式
  4. 抽象工厂模式

1、传统模式

(1)、传统方式的优缺点

  • 优点:比较好理解,简单易操作。
  • 缺点:违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码。

(2)、具体实例分析

实现类图

第一步创建Pizza类,将该类做成一个抽象类

/**
 * 将Pizza类做成抽象
 */
public abstract class Pizza {

    //名字
    private String name;

    //准备原材料,不同的披萨不一样,因此我们做成抽象方法
    public abstract void prepare();


    public void bake() {

        System.out.println(name + "baking");
    }

    public void cut() {

        System.out.println(name + "cuting");
    }

    public void box() {

        System.out.println(name + "boxing");
    }

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

第二步,这时候有两个不同Pizza子类去继承Pizza类

/*********************GreekPizza子类***********************
public class GreekPizza extends Pizza{

    @Override
    public void prepare() {
        System.out.println("给制作希腊披萨,准备原材料");
    }
}

/*********************CheesePizza子类***********************
public class CheesePizza extends Pizza{

    @Override
    public void prepare() {

        System.out.println("给制作奶酪披萨,准备原材料");
    }
}

第三步:创建Pizza订单类

/*****************Pizza订单类**********************/
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{
                break;
            }
            //输出pizz制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);
    }

    private String getType() {

        try{
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入披萨的类型:");
            String string = bufferedReader.readLine();
            return string;
        }catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

/*****************客户端调用类**********************/
public class PizzaStore {

    public static void main(String[] arg){

        new OrderPizza();
    }
}
/*****************返回结果**********************/
请输入披萨的类型:
greek
给制作希腊披萨,准备原材料
希腊披萨baking
希腊披萨cuting
希腊披萨boxing
请输入披萨的类型:

(3)、对以上传统模式的改进思路

分析:

修改代码可以接受,但是 如果我们在其他地方也有创建Pizza的代码,就意味也要修改,而创建Pizza的代码往往有多处。

思路:

把创建Pizza对象封装到一个类中,这样我们新的Pizza种类时,只需要修改该类即可,其他有创建Pizza的代码就不需要修改了。

2、简单工厂模式

(1)、简单工厂模式定义与介绍

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

(2)、具体实例分析

实现类图:

第一步创建一个简单工厂类

//简单工厂类
public class SimpleFactory {

    //根据orderType,返回一个Pizza对象
    public static Pizza createPizza(String orderType) {

        Pizza pizza = null;
        System.out.println("使用简单工厂模式");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName("希腊披萨");
        }else if(orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName("奶酪披萨");
        }
        return pizza;
    }
}

第二步创建Pizza订单类

 Pizza pizza = null;

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

    //定义一个简单的工厂对象
    public void setFactory() {

        String orderType = "";
        do {
            orderType = getType();
            pizza = SimpleFactory.createPizza(orderType);
            //输出Pizza
            if (pizza != null) { //订购成功
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();

            }else {
                System.out.println("订购披萨失败");
                break;
            }
        }while (true);
    }

第三步客户端调用

public class PizzaStore {

    public static void main(String[] arg){

        //new OrderPizza();

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

3、工厂方法模式

(1)、工厂方法模式定义

定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

(2)、实例分析

实例类图

代码实现

/*************************************
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 abstract class OrderPizza {

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

     //构造器
    public OrderPizza() {

        Pizza pizza = null;
        String orderType; //订购披萨的类型

        do {
            orderType = getType();
            pizza = createPizza(orderType);
            //输出pizz制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);
    }
}

/******************子类工厂调用父类抽象方法*******************
public class BJOrderPizza extends OrderPizza{
    @Override
    Pizza createPizza(String orderType) {

        Pizza pizza = null;
        System.out.println("使用简单工厂模式");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName("希腊披萨");
        }else if(orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName("奶酪披萨");
        }
        return pizza;
    }
}

/*****************客户端调用********************
public class PizzaStore {

    public static void main(String[] arg){
        new BJOrderPizza();
    }
}

4、抽象工厂模式

(1)、定义介绍

(2)、实例分析

实现类图

具体代码实现

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

    //让下面工厂子类来具体实现
    public Pizza createPizza(String orderType);
}
/****************************************/
//这是工厂子类
public class BJFactory implements AbsFactory{
    @Override
    public 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 OrderPizza {

    AbsFactory absFactory;

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

    public void setFactory(AbsFactory absFactory) {

        Pizza pizza = null;

        String orderType = ""; //用户输入
        this.absFactory = absFactory;
        do {
            pizza = absFactory.createPizza(orderType);
            if (pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购失败");
                break;
            }
        }while (true);
    }
}

/****************************************/
public class PizzaStore {

    public static void main(String[] arg){

        new OrderPizza(new BJFactory());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值