工廠方法模式概述
- 工廠方法模式中抽象工廠類負責定義創建對象的接口,具體對象的創建工作由繼承抽象工廠的具體類實現。
- 優點
*客戶端不需要在負責對象的創建,從而明確了各個類的職責
*如果有新的對象增加,只需要增加一個具體的類和具體的工廠類即可,不影響已有的代碼
*後期維護容易,增強了系統的擴展性
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);
}
}