// 直接上代码进行理解
// 用造房子的例子将两种设计模式完美结合~
// 全程大白话~
工厂模式
当你要造屋顶的时候,我们一般不会这样写:
Roof roof = new Roof();
因为屋顶对象的参数太多了,直接new出来非常不方便,而且当我们需要不同材质的屋顶的时候类就非常多,很难管理
于是很自然的,定义一个Roof的接口,不同材质的屋顶实现这个接口:
public interface Roof {
void buildRoof();
String getMaterial();
}
public class WoodenRoof implements Roof {
private String material = "木头";
@Override
public void buildRoof() {
System.out.println("--开始建造木屋顶--");
System.out.println("1、伐木");
System.out.println("2、搭建");
System.out.println("--木屋顶建造完成--");
}
@Override
public String getMaterial() {
return material;
}
}
然后创建一个屋顶工厂的接口,所有材料的屋顶继承这个接口:
public class RoofFactory {
public static Roof getRoof(String material) {
if("wooden".equals(material)) {
Roof woodenRoof = new WoodenRoof();
woodenRoof.buildRoof();
return woodenRoof;
}else if("iron".equals(material)) {
Roof ironRoof = new IronRoof();
ironRoof.buildRoof();
return ironRoof;
}
}
}
在消费者端这样写:
public class Client {
public static void main(String[] args) {
Roof woodenRoof = RoofFactory().getRoof("wooden");
}
}
大概画了个图:
于是当传入一个材质的时候,屋顶工厂就会帮我们创建屋顶对象~
这就是简单工厂模式,也叫静态工厂模式
但是,当我们的材质多了,不仅要新增对应的类,还要改变RoofFactory中的方法,这就违背了开闭原则:对外扩展开启,对内修改关闭!
这时我想起了架构师间口口相传的话:遇事不决加一层
在RoofFactory和WoodenRoof中间加一层,并把RoofFactory接口化
上图:
public interface RoofFactory {
Roof getRoof();
}
public class WoodenRoofFactory implements RoofFactory {
@Override
public Roof getRoof() {
Roof woodenRoof = new WoodenRoof();
woodenRoof.buildRoof();
return woodenRoof;
}
}
public class IronRoofFactory implements RoofFactory {
@Override
public Roof getRoof() {
Roof ironRoof = new IronRoof();
ironRoof.buildRoof();
return ironRoof;
}
}
消费者端这样写:
public class Client {
public static void main(String[] args) {
Roof woodenRoof = new WoodenRoofFactory().getRoof();
Roof ironRoof = new IronRoofFactory().getRoof();
}
}
这样,以后如果要加一个GoldenRoof,只需要写一个GoldenRoof实现Roof,再写一个GoldenRoofFactory实现RoofFactory,就可以实现开闭原则~
建造者模式
用户可以在不知道对象构建过程的情况下创建出复杂对象。
就像你只要和厂商说要一栋房子,厂商就会安排施工人员从零开始造一个房子出来给你,这个过程并不需要你参与也不需要你知晓
先上图看结构:
流程是:消费者告诉包工头自己要房子,包工头告诉工人建造流程,工人按照图纸造出房子
其中,包工头造房子的思路不相同,工人实现具体步骤的方法不相同,所以director和worker都是多对多的关系