设计模式第2篇:简单工厂、工厂方法、抽象工厂设计模式

1.简单工厂设计模式

 特点:一个抽象的产品类、多个具体的产品类、一个具体的工厂类。

 (1)抽象的产品类(例如产品为手机屏幕)

    public interface Screen{

      void screenSize();

    }

 (2)具体的产品类(例如需要5英寸和6英寸的手机屏幕)

    public class Screen5 implements Screen{

      @Override

      public void screenSize(){

        System.out.println("生产5英寸的屏幕")

      }

    }

    public class Screen6 implements Screen{

      @Override

      public void screenSize(){

        System.out.println("生产6英寸的屏幕")

      }

    }

    

 (3)一个具体工厂类(生产手机屏幕的工厂)

     public class ScreenFactory {

      public Screen produceScreen(int size){

        if (size == 5){

          return new Screen5();

        }else if (size==6) {

          return new Screen6();

        }

      }

    }

  使用场景:产品个数已知并且固定。

  优缺点:实现简单,当产品个数固定时推荐使用,由于增加产品种类时需要修改工厂类,所以破坏了开闭设计原则(对扩展开放,对修改关闭)。

 

2.抽象工厂模式

 特点:一个抽象的产品类,多个具体的产品类,一个抽象的工厂类,多个具体的工厂类

 (1)抽象的产品类(例如产品为手机屏幕)

    public interface Screen{

      void screenSize();

    }

 (2)具体的产品类(例如需要5英寸和6英寸的手机屏幕)

    public class Screen5 implements Screen{

      public Screen5(){

        System.out.println("生产5英寸的屏幕")

      }

    }

    public class Screen6 implements Screen{

      public Screen6(){

        System.out.println("生产6英寸的屏幕")

      }

    }

    

 (3)一个抽象工厂类(生产手机屏幕的抽象工厂)

     public interface ScreenAbstractFactory {

      public Screen produceScreen();

    }

 (4)生产具体屏幕尺寸的生产线

    public class Screen5Factory implements ScreenAbstractFactory{

      @Override

      public Screen produceScreen(){

        return new Screen5();

      }

    }

    public class Screen6Factory implements ScreenAbstractFactory{

      @Override

      public Screen produceScreen(){

        return new Screen6();

      }

    }

 (5)总工厂(拥有多条生产线的工厂)

    public class ScreenFactory{

      pubilc static createScreen(ScreenAbstractFactory factory){

        return factory.produceScreen();

      }

    }

 

  优缺点:优点面向接口编程而不是面向实现,易于扩展。

 

3.用内部类实现抽象工厂方法模式

  特点:一个抽象产品类,一个抽象工厂类,匿名内部类实现了抽象工厂的具体产品类

//一个抽象产品类
interface Screen{
    void screenSize();
}
//一个抽象工厂类
interface ScreenFactory{
    Screen produceScreen();
}
//匿名内部类实现了抽象工厂的具体产品类
class Screen5 implements Screen{
    public void screenSize(){
        System.out.println("生产5英寸屏幕");
    }
    private Screen5(){

    }
    public static ScreenFactory factory=new ScreenFactory() {
        @Override
        public Screen produceScreen() {
            return new Screen5();
        }
    };
}
//匿名内部类实现了抽象工厂的具体产品类
class Screen6 implements Screen{
    public void screenSize(){
        System.out.println("生产6英寸屏幕");
    }
    private Screen6(){

    }
    public static ScreenFactory factory=new ScreenFactory() {
        @Override
        public Screen produceScreen() {
            return new Screen6();
        }
    };
}
public class FactoryMethod {
    static Screen produceScreen(ScreenFactory factory){
        return factory.produceScreen();
    }
    public static void main(String[] agrs){
        FactoryMethod factoryMethod=new FactoryMethod();
        Screen screen5=factoryMethod.produceScreen(Screen5.factory);
        Screen screen6=factoryMethod.produceScreen(Screen6.factory);
        screen5.screenSize();
        screen6.screenSize();
    }
}

 

posted @ 2018-12-05 19:41  曲项向天歌  阅读(158)  评论(0编辑  收藏  举报