设计模式学习日志之二--工厂方法模式

工厂模式,属于创建型设计模式,需要生成的对象叫做产品,生成对象的地方叫做工厂

简单工厂模式

举个例子

创建一个面条基类(或者接口)这是产品的抽象类

public abstract class INoodles {    /**     * 描述每种面条啥样的     */  
  public abstract void desc();
}

创建之后,来一份兰州拉面

public class LzNoodles extends INoodles {
    @Override  
  public void desc() {       
    System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗");  
  }
}

泡面

public class PaoNoodles extends INoodles {   
@Override   
 public void desc() { 
       System.out.println("泡面好吃 可不要贪杯");   
 }
}

干扣面

public class GankouNoodles extends INoodles {  
  @Override   
 public void desc() {   
     System.out.println("还是家里的干扣面好吃 6块一碗");  
  }
}

之后我们要有个面馆去做面

public class SimpleNoodlesFactory {
  public static final int TYPE_LZ = 1;//兰州拉面  
  public static final int TYPE_PM = 2;//泡面   
  public static final int TYPE_GK = 3;//干扣面   
  public static INoodles createNoodles(int type) {      
  switch (type) {          
  case TYPE_LZ:         
       return new LzNoodles(); 
  case TYPE_PM:    
       return new PaoNoodles();
  case TYPE_GK:       
       default:             
  return new GankouNoodles();     
                 }    
        }
}

这个面馆就提供三种面条,你要啥就给啥

/**
 * 简单工厂模式
 */
 INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
 noodles.desc();

特点:

1.它是一个具体的类,非接口抽象类。有一个重要的create()方法,利用if或者switch创建产品并返回

2.create()方法通常是静态的,所以也称之为静态工厂

缺点

1.扩展性差,比如我要多一种面条,就要去新增一个面条产品类,需要修改工厂类方法

优点

1.利用了多态性不管什么具体产品都返回抽象产品,即不用一个一个面条去new,再去调用desc方法

2.利用了封装性,内部产品发生变化时外部使用者不会受到影响


工厂方法模式

普通工厂就是把简单工厂中具体的工厂类,划分成两层:抽象工厂层+具体的工厂子类层

面条工厂(抽象工厂类),作用就是生产面条

public abstract class NoodlesFactory {
    public abstract INoodles create();
}

拉面工厂(具体子类)

public class LzFactory extends NoodlesFactory {
    @Override
    public INoodles create() {
        return new LzNoodles();
    }
}

泡面工厂(具体子类)

public class PaoFactory extends NoodlesFactory {
    @Override
    public INoodles create() {
        return new PaoNoodles();
    }
}

干扣面工厂(具体子类)

public class GankouFactory extends NoodlesFactory {
    @Override
    public INoodles create() {
        return new GankouNoodles();
    }
}

使用的时候

NoodlesFactory factory1 = new GankouFactory();
INoodles gk3 = factory1.create();
gk3.desc();

普通工厂和简单工厂模式的区别

做出来的产品要抽象,工厂也应该要抽象

工厂方法使一个产品类的实例化延迟到具体工厂子类

好处就是当需要变化时,只需要增删响应的类,不需要修改已有的类

而简单工厂需要修改工厂的create()方法,多方法静态工厂模式需要增加一个静态方法

缺点就是,如果我们需要每次新增一个产品类,也要新增一个具体工厂类。





猜你喜欢

转载自blog.csdn.net/chanbendong/article/details/79448279
今日推荐