六大设计原则
- 单一职责(一个类干一件事)
- 接口原则(接口方法都能用到)
- 依赖倒转(接口编程) --用到
- 里氏替换(继承性的重写改变了,复用性差)
- 开闭原则(扩展开放、修改关闭) --用到
- 迪米特法则(一个类对其他类保持最少的了解) --用到
工厂模式
Spring初始化时候使用到了工厂模式
优点
扩展性高,封装性好,使用者不用了解使用对象。
缺点
添加产品需要添加工厂类,若数量过多则增加了系统的复杂度。
简单工厂模式
缺点:扩展性不好,添加新产品会修改到工厂的代码(不符合开闭原则)
优点:创建对象交由工厂处理,外界不必关心
面条的接口工厂
public interface Noodles {
void eating();
}
兰州拉面实现
public class LzNoodles implements Noodles {
@Override
public void eating() {
System.out.println("兰州拉面生产.....");
}
}
泡面实现
public class PaoNoodles implements Noodles {
@Override
public void eating() {
System.out.println("泡面生产.....");
}
}
面馆(吃什么面,创建什么对象交由面馆来管理,你不用知道面怎么做的,你只需要知道你要什么面就行了)
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static Noodles createNoodles(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
default:
return new PaoNoodles();
}
}
}
对外只暴露了面馆,可以通过面馆点你需要的面
INoodles noodles = SimpleNoodlesFactory.createNoodles
(SimpleNoodlesFactory.TYPE_PM );
noodles.eating()
工厂方法模式;
缺点,扩展是会创建新的工厂类(泡面工厂、兰州拉面工厂),造成类膨胀
优点:完全符合开闭原则
将简单工厂也定义为接口,在分不同面工厂实现这个接口,最后通过面工厂创建实现面的创建。
将面馆定义为接口
public interface SimpleNoodlesFactory {
void createNodle();
}
兰州拉面工厂实现面馆
public class LzFactory implements Noodles {
@Override
public Noodles createNodle() {
return new LzNoodles;
}
}
泡面工厂实现面馆
public class PaoFactory implements Noodles {
@Override
public Noodles createNodle() {
return new LzNoodles;
}
}
客户店面
LzNoodles lzNoodles = new PaoFactory().createNodle();
抽象工厂模式
缺点:假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
不可以增加产品,可以增加产品族
如果增加产品了 高端汽车类工厂、低端汽车类工厂都需要增加代码,这样不符合开闭原则
Engine、Seat 一堆实现类,但是不可以增加产品
public interface CarFactory {
Engine createEngine(); //引擎族
Seat createSeat(); //座位族
...... //其他族
高端汽车类工厂
/**
* 高端汽车类工厂
*/
public class BLCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new BLEngine();
}
@Override
public Seat createSeat() {
return new BLSeat();
}
}
低档汽车工厂类
/**
* 低档汽车工厂类
*/
public class DZCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new DZEngine();
}
@Override
public Seat createSeat() {
return new DZSeat();
}
小总结
简单工厂:不符合开闭原则,但是平常用的多,适合类少情况
工厂方法:适合增加产品,但是不能多,容易类膨胀
抽象工厂:不能增加产品,适合增加产品族