设计模式 - 工厂模式
简单工厂模式
public class CoffeeFactory {public Coffee get(string coffeeType) {Coffee coffee = null;if ("American".equals(coffeeType)) {coffee = new AmericanCoffee();} else if ("Latte".equals(coffeeType)) {coffee = new LatteCoffee();}return coffee; }
}
简单工厂模式不属于设计模式,比较像编程习惯。在开发中,也有人将工厂类中获取对象的方法定义为静态方法,此时为静态工厂模式,同样不属于设计模式。
优点:客户端无需关心对象的创建细节,向工厂传入参数即可获得相应的对象。初步实现责任的分离,工厂负责生产,客户端只负责消费。
缺点:增加新产品时需要修改工厂类的代码,违反了 OCP 开闭原则。
工厂方法模式
public interface CoffeeFactory {Coffee get();
}public class AmericanCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee get() {return new AmericanCoffeeFactory();}
}public class LatteCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee get() {return new LatteCoffeeFactory();}
}
工厂方法模式克服了简单工厂模式的缺点,在增加新产品时无需修改工厂类的代码。但每增加一个新产品就要增加一个具体产品类和一个对应的具体工厂类,导致系统复杂度增加。
抽象工厂模式
工厂方法模式考虑的是某一类产品的生产,如咖啡工厂只生产咖啡。而抽象工厂模式将考虑多类产品的生产,如甜品工厂不仅生产咖啡,还生产甜品。
在抽象工厂模式中,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。也就是说,美式咖啡和抹茶慕斯是同一产品族,拿铁咖啡和提拉米苏是同一产品族。
优点:可以保证通过同一个抽象工厂创建的多个对象始终来自同一族,比如通过 MacFactory 创建 UI 时,只能得到来自同一个风格的各种组件。
缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要修改。