1. 程式人生 > >設計模式第2篇:簡單工廠、工廠方法、抽象工廠設計模式

設計模式第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 ScreenFactory {

      public Screen produceScreen();

    }

 (4)生產具體螢幕尺寸的具體工廠

    public class Screen5Factory implements ScreenFactory{

      @Override

      public Screen produceScreen(){

        return new Screen5();

      }

    }

    public class Screen6Factory implements ScreenFactory{

      @Override

      public Screen produceScreen(){

        return new Screen6();

      }

    }

  適用場景:與簡單工廠模式一樣,只是遵循了開閉設計原則。

3. 抽象工廠模式

  當只做手機螢幕的廠家做了一段時間後發現手機市場的前景更大,於是想轉行做手機了,此時需求發生了變化,做手機不僅需要螢幕,還需要CPU、電池、儲存等,由於需要生產的產品種類越來越多,此外針對不同的使用者還需要設計不同的機型,此時前兩種工廠設計模式便已不再適用,於是有了抽象工廠模式。

  特點:一個抽象工廠,多個具體工廠,多個抽象產品,多個具體產品

  (1)多個抽象產品類(CPU產品類、螢幕產品類、電池產品類)

     public interface Cpu{

        void run();

      }

     public interface Screen{

        void screenSize();

      }

     public interface Power{

        void powerCapacity();

      }

   (2)多個具體產品類(CPU具體產品類、螢幕具體產品類、電池具體產品類)

      public class Cpu650 implements Cpu{

        @Override

        public void run(){

          System.out.println("生產cpu650");

        }

      }

      public class Cpu850 implements Cpu{

        @Override

        public void run(){

          System.out.println("生產cpu850");

        }

      }

      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英寸屏");

        }

      }

      public class power3000 implements power{

        @Override

        public void powerCapacity(){

          System.out.println("生產3000毫安電池");

        }

      }

      public class power4000 implements power{

        @Override

        public void powerCapacity(){

          System.out.println("生產4000毫安電池");

        }

      }

   (3)一個抽象工廠類(生產手機的工廠類)

      public interface PhoneFactory{

        Cpu produceCpu();

        Screen produceScreen();

        Power producePower();

      }

   (4)多個具體工廠類(生產不同型號的手機用不同的具體工廠類)

      public class premiumPhone implements Phone{

        @Override

        public Cpu produceCpu(){

          return new Cpu850();

        }

        @Override

        public Power producePower(){

          return new Power4000();

        }

        @Override

        public Screen produceScreen(){

          return new Screen6();

        }

      }

      public class lowendPhone implements Phone{

        @Override

        public Cpu produceCpu(){

          return new Cpu650();

        }

        @Override

        public Power producePower(){

          return new Power3000();

        }

        @Override

        public Screen produceScreen(){

          return new Screen5();

        }

      }

  適用場景:產品物件多樣,產品之間存在相互依賴或關聯關係。

  優缺點:優點就是適用於構造大量、不同層次的產品。