其他分享
首页 > 其他分享> > 设计模式笔记3-工厂方法模式

设计模式笔记3-工厂方法模式

作者:互联网

3.工厂方法模式

        简单工厂模式的主要考虑的是对产品种类的扩展,能让产品种类的扩展变得容易。现在如果生产产品的工厂划分了地域(如BJFactory,TJFactory),那么原有的方法实现此目标还合适吗?不合适的话,该如何改进?(不考虑Order的增长)

3.1简单工厂模式

思路

在原来的SimpleFactory类的位置直接分成BJFactory与TJFactory两个类

UML类图

         可以看到,在增加新的工厂后,每次都需要在Order中聚合新的工厂。而每次增加新种类时,又必须在工厂中进行修改,由于工厂都是直接聚合在Order类中,所以很可能会导致Order类出现问题。为了降低耦合性,可以使用工厂方法模式。

3.2工厂方法模式

思路

可以将创建一个抽象的工厂类,让具体的工厂类去现象抽象的工厂。

UML类图

 

         这样做可以让降低程序的耦合性,Order类在使用Factory的方法时,在Factory中不会生产面包,而是交给Factory的子类,让子类完成生产面包的过程。无论以后再新建什么样的工厂,只要工厂继承了Factory抽象类即可,不会影响到Order。

代码

//Bread.java
public abstract class Bread {
    protected String type;

    //用于给设置type的值
    public void setType(String type) {
        this.type = type;
    }

    //准备面包材料
    public void prepare() {
        System.out.println("正在准备" + type + "面包的材料");
    }

    //烘焙面包
    public void bake() {
        System.out.println(type + "正在烘焙中");
    }

    //打包面包
    public void pack() {
        System.out.println(type + "正在打包中");
    }
}

class BJButterBread extends Bread {
}
class BJToast extends Bread {
}
class TJButterBread extends Bread {
}
class TJToast extends Bread {
}


//Factory.java
//抽象的工厂Factory类
public abstract class Factory {
    //创建生产面包的create方法
    protected abstract Bread createBread(String type);

    public void orderBread() {

        while (true) {

            //调用函数生产面包
            Bread bread = createBread(getType());

            //输出面包的订购过程
            if (bread != null) {
                bread.prepare();
                bread.bake();
                bread.pack();
                System.out.println("----------------------------");
            } else {
                System.out.println("订购失败");
                break;
            }
        }
    }

    //可以获取客户希望订购的面包种类,就是从控制台上获取输入数据
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Bread 种类:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

//BJFactory.java
public class BJFactory extends Factory {
    @Override
    protected Bread createBread(String type) {
        Bread bread = null;
        if ("ButterBread".equalsIgnoreCase(type)) {
            bread = new BJButterBread();
            bread.setType("BJButterBread");
        } else if ("Toast".equalsIgnoreCase(type)) {
            bread = new BJButterBread();
            bread.setType("BJToast");
        }
        return bread;
    }
}

//TJFactory.java
public class TJFactory extends Factory {
    @Override
    protected Bread createBread(String type) {
        Bread bread = null;
        if ("ButterBread".equalsIgnoreCase(type)) {
            bread = new TJButterBread();
            bread.setType("TJButterBread");
        } else if ("Toast".equalsIgnoreCase(type)) {
            bread = new TJButterBread();
            bread.setType("TJToast");
        }
        return bread;
    }
}

//Order.java
public class Order {
    static Factory factory;
    public static void main(String[] args) {
        String address = getType();
        //根据用户地点去相应的工厂制作面包
        if ("BJ".equalsIgnoreCase(address)) {
            factory = new BJFactory();
        } else if ("TJ".equalsIgnoreCase(address)) {
            factory = new TJFactory();
        }
        if (factory != null) {
            factory.orderBread();
        }
    }
    
    //可以获取客户的地点信息,就是从控制台上获取输入数据
    private static String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Address:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

标签:设计模式,String,笔记,工厂,new,bread,type,public,Bread
来源: https://blog.csdn.net/qq_47714378/article/details/120628806