一、簡單工廠模式
注意: 簡單工廠實際上不算設計模式中的一種
角色: 抽象產品角色、具體產品角色AB等、唯一的一個工廠(通過傳遞一個參數給工廠,返回具體的產品)
缺點: 只有一個工廠,其職責過重
實例: 電視
================================1、抽象產品=================================
// 抽象產品(可以是抽象類或者接口)
public abstract class TV {
public abstract void play();
}
================================2、具體產品=================================
// 具體產品A
public class HaierTV extends TV {
@Override
public void play() {
System.out.println("HaierTV is playing.");
}
}
// 具體產品B
public class HisenseTV extends TV {
@Override
public void play() {
System.out.println("HisenseTV is playing.");
}
}
================================3、工廠=================================
// 唯一的工廠(根據參數,生產具體的產品)
public class TVFactory {
public static TV productTV(String brand) {
TV tv = null;
switch (brand) {
case "HaierTV":
tv = new HaierTV();
break;
case "HisenseTV":
tv = new HisenseTV();
break;
}
return tv;
}
}
================================客戶端類=================================
public class Main {
public static void main(String[] args) {
TV haierTV = TVFactory.productTV("HaierTV");
haierTV.play();
TV hisenseTV = TVFactory.productTV("HisenseTV");
hisenseTV.play();
}
}
>>>>>> HaierTV is playing.
>>>>>> HisenseTV is playing.
二、工廠方法
角色: 抽象產品角色、具體產品角色AB等、抽象工廠角色、具體工廠角色AB
區別於簡單工廠模式: 每個產品由該產品具體的工廠生產,避工廠職責過重
實例: 電視
================================1、抽象產品=================================
// 抽象產品(可以是抽象類或者接口)
public abstract class TV {
public abstract void play();
}
================================2、具體產品=================================
// 具體產品A
public class HaierTV extends TV {
@Override
public void play() {
System.out.println("HaierTV is playing.");
}
}
// 具體產品B
public class HisenseTV extends TV {
@Override
public void play() {
System.out.println("HisenseTV is playing.");
}
}
================================3、抽象工廠=================================
// 抽象工廠
public abstract class TVFactory {
public abstract TV productTV();
}
================================4、具體工廠=================================
// 具體工廠A
public class HaierTVFactory extends TVFactory {
@Override
public TV productTV() {
return new HaierTV();
}
}
// 具體工廠B
public class HisenseTVFactory extends TVFactory {
@Override
public TV productTV() {
return new HisenseTV();
}
}
================================客戶端類=================================
public class Main {
public static void main(String[] args) {
TVFactory haierTVFactory = new HaierTVFactory();
TV haierTV = haierTVFactory.productTV();
haierTV.play();
TVFactory hisenseTVFactory = new HaierTVFactory();
TV hisenseTV = hisenseTVFactory.productTV();
hisenseTV.play();
}
}
>>>>>> HaierTV is playing.
>>>>>> HisenseTV is playing.