設計模式之工廠模式

在這裏插入圖片描述

工廠方法模式概述

  • 工廠方法模式中抽象工廠類負責定義創建對象的接口,具體對象的創建工作由繼承抽象工廠的具體類實現。
    1. 優點
      *客戶端不需要在負責對象的創建,從而明確了各個類的職責
      *如果有新的對象增加,只需要增加一個具體的類和具體的工廠類即可,不影響已有的代碼
      *後期維護容易,增強了系統的擴展性
      2.缺點
      *需要額外的編寫代碼,增加了工作量~~

- 測試類

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:10
 */
public class Demo {
    public static void main(String[] args) {


        //傳統的創建對象
        Dog dog = new Dog();
        dog.setName("旺財");

        Pig pig = new Pig();
        pig.setName("佩奇");

        dog.eat();
        pig.eat();
        System.out.println("*********************");
        //使用工廠模式來創建對象

        DogFactory dogFactory = new DogFactory();
        Animal dog1 = dogFactory.createAnimal();
        dog1.eat();


        PigFactory pigFactory = new PigFactory();
        Animal pig1 = pigFactory.createAnimal();
        pig1.eat();
    }
}

- 定義動物屬性

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:10
 */
public abstract class Animal {

    private String name;
    private  String color;

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public abstract void eat();
}

- 創建抽象動物工廠方法

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:09
 */
/*public interface AnimalFactory {
}*/
public abstract class AnimalFactory {

    public abstract  Animal createAnimal();

   // public abstract Animal newAnimal();
}

- 創建狗方法 繼承動物

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:07
 */
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃貓");
    }
}

- 創建狗工廠

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:09
 */
public class DogFactory extends AnimalFactory {
    @Override
    public Animal createAnimal() {
        Dog dog = new Dog();
        dog.setName("旺財旺財");
        dog.setColor("yellow");
        return dog;
    }
}

- 創建豬屬性

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:08
 */
public class Pig  extends Animal{
    @Override
    public void eat() {
        System.out.println("豬吃菜");
    }
}

- 豬工廠

package lesson.animal.animal;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:09
 */
public class PigFactory extends AnimalFactory {
    @Override
    public Animal createAnimal() {
        Pig pig = new Pig();
        pig.setName("ddd");
        pig.setColor("red");
        return pig;
    }
}

簡單工廠模式概述和代碼實現

  • 又叫靜態工廠方法模式,它定義一個具體的工廠類負責創建一些類的實例

  • 優點 : 客戶端不需要在負責對象的創建,從而明確了各個類的職責

  • 缺點: 這個靜態工廠類負責所有對象的創建,如果有新的對象增加,或者某些對象的創建方式不同,就需要不斷的修改工廠類,不利於後期的維護

動物屬性

package lesson.animal.moder;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:10
 */
public abstract class Animal {

    private String name;
    private  String color;

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public abstract void eat();
}

- 動物工廠

package lesson.animal.moder;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:38
 */
public class AnimalFactory {

  /*  public static Dog createDog(){
        Dog dog = new Dog();
        return dog;
    }*/
        //抽象類和子類的關係  Animal可以是個接口
    public static Animal createDog(){
        Dog dog = new Dog();
        return dog;
    }
    public static Pig createPig(){
        Pig pig = new Pig();
        return pig;
    }
}

狗屬性

package lesson.animal.moder;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:07
 */
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃貓.....");
    }
}

  • 豬屬性
package lesson.animal.moder;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:08
 */
public class Pig  extends Animal {
    @Override
    public void eat() {
        System.out.println("豬吃菜....");
    }
}

測試類

package lesson.animal.moder;

/**
 * User: 彭家琪
 * Date: 2019/9/10   17:42
 */
public class Demo {
    public static void main(String[] args) {
   
        //創建對象,通過簡單的工廠模式
        Animal dog = AnimalFactory.createDog();
        Pig pig = AnimalFactory.createPig();
        dog.setName("旺財");
        pig.setName("佩奇");

        System.out.println(dog);

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章