23种设计模式之工厂方法模式

工厂方法(FactoryMethod)模式定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中,满足创建型模式中所要求的‘创建与使用相分离’的特点。如果创建的产品(对象)不多,只有一个工厂类就可以的话,这种模式称为‘简单工厂模式’,但它不属于23中设计模式,因为增加产品是会违背‘开闭原则’。

优点:用户只需要知道具体的工厂名称就可以得到所需要的产品,不需要产品创建的详细过程。

新增产品是只需要添加具体的产品类和具体的工厂类。不需要对原工厂进行改变,满足‘开闭原则’。但是会有一个缺点,没当新增一个产品,就需要增加一个具体的产品类和对应的工厂类,增加了系统的复杂度。

使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

代码演示:

interface food{}

class Apple implements food{}
class Banana implements food{}
class Watermelon implements food{}

public class StaticFactory {

    private StaticFactory(){}
    
    public static food getApple(){  
        return new Apple(); 
  }
    public static food getBanana(){
        return new Banana(); 
  }
    public static food getWatermelon(){ 
       return new Watermelon(); 
  }
}

class Client{
    //用户只需要知道具体的工厂名称就可以得到所需要的产品,不需要产品创建的详细过程
    public void get(String name){
        food f = null ;
        if ( name.equals("Apple")) {
            f = StaticFactory.getApple();
        }else if ( name.equals("Banana")){
            f = StaticFactory.getBanana();
        }else {
            f = StaticFactory.getWatermelon();
        }
    }
}

你可能感兴趣的:(23种设计模式之工厂方法模式)