设计模式笔记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