“关于工厂方法秒懂的讲解”

七夕不单身,巧用工厂方法创建你想要的女朋友,炸哇(java)面向对象。

1.简单工厂,什么是简单工厂?

下面就要实例来阐述下吧

(1)定义女朋友的类型

public enum gfType{

HU_NAN,GUANG_DONG,BEIJING;

}

(2)定义女朋友的共有方法抽象类

public abstract class BaseGF{

abstract void eat();

void shopping(){
   System.out.println("都是购物狂人");     
}

}

(3)创建湖南的女朋友

public class HuNanGf extends BaseGf{

@Override
public void eat(){
  System.out.println("湖南的女朋友喜欢吃辣的");
}

}

创建广东的女朋友

public class GuangDongGf extends GF{

@Override 
public void eat(){
  System.out.println("山东的女朋友喜欢吃面食类的");
}

}

创建北京的女朋友

public class BeiJingGf extends GF{

@Override
public void eat(){
  System.out.println("北京的女朋友吃卤煮");

}

}

(4)创建生产女朋友的工厂类

public BaseGF GFFatroy{

public static void createGf(GFtype gfType){
   switch(gfType){
      case HU_NAN:

        return new HuNanGF();

      case GUANG_DONG:

        return new GuangDongGf();

      case BEIJING:

        return BeiJingGf();

   }
   return null;
}

}

(5)测试想要得到的女朋友
public class test{

public static void main(String args []){
   BaseGF gf = new GFFactroy.createGf(Gftype.HU_NAN);
   gf.eat();
   gf.shoping();
}

}

总结:简单工厂方法提供了一个生产所有产品实例的工厂类,并且这些产品的实例都有一个共同的父类

2.工厂方法

假如现在我们突然想要一个云南的女朋友,那么按照简单工厂方法的模式,我们需要在GFType添加新的女朋友类型,我们需要新建云南女朋友的具体产品类。这样也不符合代码的开闭原则,因此我们创建一个生产女朋友的接口,这样想要哪个地方的女朋友就新建一个自己的工厂类不会影响别的已创建的工厂

(1)创建生产女朋友的接口

public interface IGFactroy{
   BaseGF crateGf();
}

(2)新建云南女朋友的具体产品类(这个不变)
public class yunNanGf extends BaseGF{

   @Override
    public void eat(){
      Ststem.out.println("云南女朋友的口味");
    }

}

(2)创建云南女朋友的工厂类

public class YunNanFactroy implements IGFactroy{

@Override
public BaseGF createGf(){
      return new yunNanGf();    
}

}

(3)测试新产生的女朋友
public class Test{

public static void main(String [] args){

BaseGf  gf = new YunNanFactroy.createGf();
gf.eat();
gf.shoping();

}
}

总结:工厂方法提供了一个可以创建任意产品的接口,让子类决定实例化哪一个类,工厂方法让一个类的实例化延迟到了子类

3.抽象工厂方法

多年之后你和女朋友准备结婚了,需要见家长,需要家长的意见该如何处理呢

public interface IGFather{

void sugesstion();

}

public interface IGFactroy{
BaseGf createGf();

IGFather createFather();

}

public class YunNanGFFactroy implements IGFFactroy{
@Override
public BaseGf createGf(){
return new yunNanGf();
}

@Override
public IGFFather createGFFactroy(){
   return new YuNanGFFactroy();
}

}

public class YunNanGFFather implements IGFather{

@Override
public void suggestion(){
  System.out.println("已经同意你们结婚");
}

}

public class Test{
public static void main(String [] args){
IGFFactroy yunNanGFFactroy = new YunNanGFFactroy();
BaseGf yunNanGf = yunNanGFFactroy.createGF();
yunNanGf.eat();
yunNanGf.shoping();

IGFFather yunNanGFFather =           yunNanGFFactroy.createGFFactroy();

yunNanGFFactroy.suggestion();

}
}

结论:抽象工厂为我们提供了一系列相关或者相互依赖对象的接口而无需指定他们的具体类。

千里之行,始于足下,自己敲一遍之后是不是对简单工厂(静态工厂),工厂方法,和抽象工厂有了一定的认识。