工厂模式分简单工厂模式、抽象工厂模式。
模式来源于生活,简单工厂如小作坊,可以制作奶茶、甜点、咖啡等;
抽象工厂如工厂中的流水线专心只做一件事,提高效率。
public class SimpleFactory {
public static Milk getMilk(String milkName) {
if (milkName.equals("yiLi") {
//伊利牛奶
return new YiLi();
}
if (milkName.equals("Mengniu")) {
//蒙牛牛奶
return new Mengniu();
}
}
}
Mengniu、YiLi 牛奶抽象出一个produceMilk()方法
public interface Milk {
Object produceMilk();
}
继承实现
public class SimpleFactoryTest {
public static void main(String[] args) {
Milk mengniu = SimpleFactory.getName("Mengniu");
Milk yili = SimpleFactory.getName("YiLi");
mengniu.produceMilk();
yili.produceMilk();
}
}
public class Mengniu implements Milk {
public Object produceMilk() {
return "this is Mengniu Milk";
}
}
public class YiLi implements Milk {
public Object produceMilk() {
return "this is YiLi Milk";
}
}
开闭原则,对原有方法不建议修改,只扩展,当需要产生新的牛奶的时候需要在 SimpleFactory 中的 getMilk方法新加 if 条件,违反了开闭原则,这是简单工厂的不足,下面是改造之后的抽象工厂。
public abstract class AbstractFactory {
public abstract Milk getMengniu();
public abstract Milk getYiLi();
//todo 新增其它牛奶
}
public ChinaMilkFactory extends AbstractFactory {
@Override
public Milk getMengniu() {
return new Mentniu();
}
@Override
public Milk getYiLi() {
return new YiLi();
}
}
这样的话,每次在新增其它牛奶的时候,只需要在抽象接口中定义,并在实现类实现就OK了,对原有的方法不修改,符合开闭原则。这样也避免了 if else 的重复编写。