1. 程式人生 > >java設計模式----工廠設計模式

java設計模式----工廠設計模式

目錄

    1.面向物件設計的基本原則

  2.簡單工廠模式

  3.工廠方法模式

  4.抽象工廠模式

 

  工廠設計模式的核心本質:

  1、例項化物件,用工廠方法代替new操作。

  2、將選擇實現類、建立物件統一管理和控制。從而將呼叫者跟我們的實現類解耦。

一、面向物件設計的基本原則

 

  1.OCP(開閉原則,Open-Closed Principle):一個軟體的實體應當對擴充套件開放,對修改關閉。

  2.DIP(依賴倒轉原則,Dependence Inversion Principle):要針對介面程式設計不要針對實現程式設計。

  3.LoD(迪米特法則,Law of Demeter):只與你直接的朋友通訊,而避免和陌生人通訊。

二、簡單工廠模式

  

  如果不使用工廠設計模式來建立物件,那麼我們的程式將與多個類打交道。但是如果我們使用工廠設計模式的話,程式則不會與多個類有交集。

一下是不使用工廠設計模式類的關係圖與Demo:

package com.demo.simpleFactory;
/**
 *動物介面
 */
public interface Animal {
    void sleep();
}
Alimal介面
 1
package com.demo.simpleFactory; 2 3 public class Cat implements Animal{ 4 5 @Override 6 public void sleep() { 7 System.out.println("貓在睡覺"); 8 } 9 10 }
Cat類
 1 package com.demo.simpleFactory;
 2 
 3 public class Dog implements Animal{
 4
5 @Override 6 public void sleep() { 7 System.out.println("狗在睡覺"); 8 } 9 10 }
Dog類
 1 package com.demo.simpleFactory;
 2 
 3 public class Client {
 4     public static void main(String[] args) {
 5         Animal a = new Dog();
 6         Animal a1 = new Cat();
 7         a.sleep();
 8         a1.sleep();
 9     }
10 }
Client使用者類

 

  使用簡單工廠模式則是建立一個工廠,使用者使用的時候只需要在工廠類中拿物件。

 1 package com.demo.simpleFactory;
 2 
 3 /**
 4  * 工廠類
 5  * @author Administrator
 6  *
 7  */
 8 public class SimpleFactory {
 9     public static Animal createAnimal(String animal){
10         if("狗".equals(animal)){
11             return new Dog();
12         }else if("貓".equals(animal)){
13             return new Cat();
14         }else{
15             return null;
16         }
17     }
18 }
SimpleFactory簡單工廠類

  另一種寫法:

 1 package com.demo.simpleFactory;
 2 
 3 /**
 4  * 工廠類
 5  * @author Administrator
 6  *
 7  */
 8 public class SimpleFactory {
 9     public static Animal createDog(){
10             return new Dog();
11     }
12     public static Animal createCat(){
13         return new Cat();
14     }
15 }
SimpleFactory簡單工廠類

 

  使用者則可以通過如下方法建立物件:

package com.demo.simpleFactory;
/**
 * 使用者通過呼叫工廠建立物件
 * @author Administrator
 *
 */
public class Client {
    public static void main(String[] args) {
        Animal a1 = SimpleFactory.createAnimal("狗");
        Animal a2 = SimpleFactory.createAnimal("貓");
        a1.sleep();
        a2.sleep();
    }
}

  

  使用工廠模式建立物件的類依賴圖如下:

 三、工廠方法模式

  

  在以上的工廠模式中,設計原理是違反面向物件基本原則的OCP原則的,我們需要將重新設計這個工廠方法模式。

以下是重新設計的工廠模式圖解與Demo:

1 package com.demo.simpleFactory;
2 /**
3  * 工廠方法模式抽象類
4  * @author Administrator
5  *
6  */
7 public interface AnimalFactory {
8     Animal createAnimal();
9 }
工廠抽象類
 1 package com.demo.simpleFactory;
 2 
 3 
 4 public class CatFactory implements AnimalFactory{
 5 
 6     @Override
 7     public Animal createAnimal() {
 8         return new Cat();
 9     }
10 
11 }
Cat工廠
 1 package com.demo.simpleFactory;
 2 
 3 public class Dog implements Animal{
 4 
 5     @Override
 6     public void sleep() {
 7         System.out.println("狗在睡覺");
 8     }
 9     
10 }
Dog工廠
 1 package com.demo.simpleFactory;
 2 /**
 3  * 使用者通過呼叫工廠建立物件
 4  * @author Administrator
 5  *
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9         Animal cat = new CatFactory().createAnimal();
10         Animal dog = new DogFactory().createAnimal();
11         cat.sleep();
12         dog.sleep();
13     }
14 }
Client使用者

 

四、抽象工廠模式

  

  抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。

  作用:用來生產不同產品族的全部產品,不能增加新的產品,但支援產品族。

  抽象工廠模式的簡單實現:

軟體包結構如下:

package com.demo.abstractFactory.spare;
/**
 * 引擎介面
 * @author Administrator
 *
 */
public interface Engine {
    void run();
}
Engine介面
package com.demo.abstractFactory.spare;
/**
 * 座椅介面
 * @author Administrator
 *
 */
public interface Seat {
    void feel();
}
Seat介面
package com.demo.abstractFactory.spare;
/**
 * 輪胎介面
 * @author Administrator
 *
 */
public interface Tyre {
    void quality();
}
Tyre介面
package com.demo.abstractFactory.factory;

import com.demo.abstractFactory.spare.Engine;
import com.demo.abstractFactory.spare.Seat;
import com.demo.abstractFactory.spare.Tyre;
/**
 * 汽車工廠
 * @author Administrator
 *
 */
public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
    Tyre createTyre();
}
CarFactory介面
package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Engine;

public class LowEngine implements Engine{

    @Override
    public void run() {
        System.out.println("汽車跑得慢");
    }
    
}
 package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Seat;

public class LowSeat implements Seat{

    @Override
    public void feel() {
        System.out.println("座椅沒按摩功能");
    }

}
package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Tyre;

public class LowTyre implements Tyre{

    @Override
    public void quality() {
        System.out.println("輪胎易磨損");
    }

}
package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Engine;

public class LuxuryEngine implements Engine{

    @Override
    public void run() {
        System.out.println("汽車跑得快");
    }

}
package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Seat;

public class LuxurySeat implements Seat{

    @Override
    public void feel() {
        System.out.println("座椅有按摩功能");
    }

}
package com.demo.abstractFactory.product;

import com.demo.abstractFactory.spare.Tyre;

public class LuxuryTyre implements Tyre{

    @Override
    public void quality() {
        System.out.println("輪胎耐磨損");
    }

}
產品實現類
package com.demo.abstractFactory.factory;

import com.demo.abstractFactory.product.LuxuryEngine;
import com.demo.abstractFactory.product.LuxurySeat;
import com.demo.abstractFactory.product.LuxuryTyre;
import com.demo.abstractFactory.spare.Engine;
import com.demo.abstractFactory.spare.Seat;
import com.demo.abstractFactory.spare.Tyre;

public class LuxuryCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        return new LuxuryTyre();
    }
    
}
高階工廠類
package com.demo.abstractFactory.factory;

import com.demo.abstractFactory.product.LowEngine;
import com.demo.abstractFactory.product.LowSeat;
import com.demo.abstractFactory.product.LowTyre;
import com.demo.abstractFactory.spare.Engine;
import com.demo.abstractFactory.spare.Seat;
import com.demo.abstractFactory.spare.Tyre;

public class LowCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LowEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowSeat();
    }

    @Override
    public Tyre createTyre() {
        return new LowTyre();
    }
    
}
低階工廠類
package com.demo.abstractFactory;

import com.demo.abstractFactory.factory.CarFactory;
import com.demo.abstractFactory.factory.LowCarFactory;
import com.demo.abstractFactory.factory.LuxuryCarFactory;

public class Client {
    public static void main(String[] args) {
        CarFactory lowCarFactory = new LowCarFactory();
        CarFactory luxuryCarFactory = new LuxuryCarFactory();
        lowCarFactory.createEngine().run();
        lowCarFactory.createSeat().feel();
        luxuryCarFactory.createTyre().quality();
    }
}
客戶端實現類