简单工厂模式

不属于GOF的23种经典设计模式,比较像是一种编程习惯

简单工厂包含如下角色:
抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
具体产品:实现或者继承抽象产品的子类
具体工厂:提供了创建产品的方法,调用者通过该方法来创建产品。

抽象产品:

public abstract class Coffee {
public abstract String getName();
}
具体产品:
public class AmericanCoffee extends Coffee{

@Override
public String getName() {
return "美式咖啡";
}
}
public class LatteCoffee extends Coffee{

@Override
public String getName() {
return "拿铁咖啡";
}
}
具体工厂:
public class SimpleCoffeeFactory {

public Coffee createCoffee(String type){
Coffee coffee=null;
if("american".equals(type)){
coffee=new AmericanCoffee();
}else if("latte".equals(type)){
coffee=new LatteCoffee();
}else{
throw new RuntimeException("对不起,您点的咖啡没有了");
}
return coffee;
}
}
点咖啡:
public class CoffeeStore {
public Coffee orederCoffee(String type){
SimpleCoffeeFactory simpleCoffeeFactory=new SimpleCoffeeFactory();
return simpleCoffeeFactory.createCoffee(type);
}
}

处理创建对象的细节,一旦有了SimpleCoffeeFactory,Cofffeestore类中的orderCoffee()就变成此对象的客
户,后期如果需要Coffee对象直接从工厂中获取即可。这样详情就解除了和Coffee实现类的耦合,同时又产生了新的耦合,
CoffeeStore对象和SimpleCoffeeFactory工厂对象的:耦合,工厂对象和商品对象的耦合。
后期如果再加新品种的咖啡,我们势必要需求修改SimpleCoffeeFactory的代码,违反了开闭原则。工厂类的客户端可能有很多,比
如创建美团外卖等,这样只需要修改工厂类的代码,省去其他的修改操作。
优缺点
优点:
封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新
产品直接修改工厂类,而不需要在原代码中修改,这样样就降低了客户代码修改的可能性,更加容易扩展。
缺点:
增加新产品时还是需要修改工厂类的代码,违背了"开闭原则"。

静态工厂

在开发中也有一部分人将工厂类中的创建对象的功能定义为静态的,这个就是静态工厂模式,它也不是不种设计模式中的。

public class SimpleCoffeeFactory {

public static Coffee createCoffee(String type){
Coffee coffee=null;
if("american".equals(type)){
coffee=new AmericanCoffee();
}else if("latte".equals(type)){
coffee=new LatteCoffee();
}else{
throw new RuntimeException("对不起,您点的咖啡没有了");
}
return coffee;
}
}