工厂模式是将对象的创建和使用分开,使用者只用关心使用而不需要去关心对象的创建。
简单工厂模式
- 通过type 来生产不同的类对象
/**
* 根据不同的类型来创建不同的对象
* @param type
* @return
*/
public static Snacks getSnacks (int type) {
if (type == TYPE_CHEESE){
return new Cheese() ;
}else if (type == TYPE_PUDDING){
return new Pudding();
}
return null;
}
- 通过工厂方法类获取不同类的对象---避免了修改getObjectByType ()方法, 添加新的类对象获取的时候只需要新增一个获取方法即可
/**
* 获取奶酪
* @return
*/
public static Snacks getCheese () {
return new Cheese();
}
/**
* 获取布丁
* @return
*/
public static Snacks getPudding (){
return new Pudding() ;
}
工厂方法模式
工厂方法模式是简单工厂模式的升级, 它是由于简单工厂模式不符合 软件设计6大原则中的: 单一职责原则 和 开闭原则 而出现的。 它在新增类对象获取的时候只需要扩展新的Factory即可,不需要去修改已有的Factory。 它将将工厂类抽象出一个接口,对象的创建方法延迟到工厂子类去实现;是多工厂形式。
它的缺点是:构造了太多的Factory,很冗余 。 实际运用视情况而定
/**
* @author spark on 2021/5/11
* @description 工厂类接口
*/
interface AbstractSnacksCreateFactory {
Snacks getSnacks ();
}
/**
* @author spark on 2021/5/11
* @description 奶酪类的Factory
*/
public class CheeseFactory implements AbstractSnacksCreateFactory{
@Override
public Snacks getSnacks() {
return new Cheese();
}
}
如果后边要新增 果冻类的创建 只需要构想一个果冻类Factory 实现AbstractSnacksCreateFactory 即可。
抽象工厂模式
解决了多个工厂匹配混乱的问题
比如: 奶酪有奶酪的包装Factory, 布丁有布丁的包装Factory,如果不统一管理,可能就会出现奶酪用了布丁的包装,或者布丁用了奶酪的包装,造成混乱。
此时我们就需要 将匹配集合抽象出一个工厂集合接口
/**
* @author spark on 2021/5/11
* @description 包装和零食的获取 抽象出来一个接口
*/
public interface AbstractFactory {
// 获取零食
Snacks getSnacks ();
// 获取零食包装
Bag getBag ();
}
/**
* @author spark on 2021/5/11
* @description 获取带包装的奶酪
*/
public class CheeseWithBagFactory implements AbstractFactory {
private CheeseFactory cheeseFactory = new CheeseFactory();
private CheeseBagFactory cheeseBagFactory = new CheeseBagFactory();
@Override
public Snacks getSnacks() {
return cheeseFactory.getSnacks();
}
@Override
public Bag getBag() {
return cheeseBagFactory.getBag();
}
}
建造者模式
使用者不用去关心对象的创建,也不要了解所有的参数,需要用到什么就用相关参数去获取对象即可。
场景: 当一个类的构造函数参数个数超过4个,并且这些参数有些是可选的参数,这个时候就可以考虑使用建造者模式。