工廠模式
三種工廠:簡單工廠模式、工廠方法模式、抽象工廠模式。
簡單工廠模式:
簡單工廠模式:用戶可以通過工廠得到自己需要的產品,比如說通過通過工廠得到一雙鞋,鞋子有耐克,adidas等。
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
factory.createShoes("Nike");
factory.createShoes("Adidas");
}
}
public class Factory {
public Shoes createShoes(String name) {
switch (name) {
case "Nike":
return new Nike();
case "Adidas":
return new Adidas();
default:
break;
}
return null;
}
}
abstract class Shoes {
public Shoes() {
}
}
public class Nike extends Shoes {
public Nike() {
System.out.println("製造一雙Nike");
}
}
public class Adidas extends Shoes {
public Adidas() {
System.out.println("製造一雙Adidas");
}
}
可以看出,簡單工廠模式的擴展性不佳,如果要增加一種鞋子,需要另加一個類,同時switch中也要加上對應的種類。
工廠方法模式:
工廠方法模式在需要擴展時不會在工廠類中新增代碼,只會新增一個具體的工廠實現類。
public class Customer {
public static void main(String[] args) {
// 特定的工廠製造特定的鞋子。
FactoryShoesNike factoryShoesNike = new FactoryShoesNike();
factoryShoesNike.createShoes();
FactoryShoesAdidas factoryShoesAdidas = new FactoryShoesAdidas();
factoryShoesAdidas.createShoes();
}
}
//工廠父類提供造鞋方法
interface Factory {
Shoes createShoes();
}
//具體的工廠實現製造過程
public class FactoryShoesNike implements Factory {
@Override
public Nike createShoes() {
return new Nike();
}
}
public class FactoryShoesAdidas implements Factory {
@Override
public Adidas createShoes() {
return new Adidas();
}
}
abstract class Shoes {
public Shoes() {
}
}
public class Nike extends Shoes {
public Nike() {
System.out.println("製造一雙Nike");
}
}
public class Adidas extends Shoes {
public Adidas() {
System.out.println("製造一雙Adidas");
}
}
抽象工廠模式:
隨着需求的增加,同一款鞋子會出現不同的特徵,比如說鞋的氣墊會不一樣,鞋的鞋面材質會不一樣等等。這時候就需要就需要氣墊,材質這樣的產品基類。
public class Customer {
public static void main(String[] args) {
// 每雙鞋的氣墊和材質都不一樣
FactoryShoesAdidas factoryShoesAdidas = new FactoryShoesAdidas();
factoryShoesAdidas.createAirCushion();
factoryShoesAdidas.createMaterial();
FactoryShoesNike factoryShoesNike = new FactoryShoesNike();
factoryShoesNike.createAirCushion();
factoryShoesNike.createMaterial();
}
}
// 工廠類
interface Factory {
public AirCushion createAirCushion();
public Material createMaterial();
}
public class FactoryShoesAdidas implements Factory {
@Override
public AirCushion createAirCushion() {
return new AirCushionA();
}
@Override
public Material createMaterial() {
return new MaterialA();
}
}
public class FactoryShoesNike implements Factory {
@Override
public AirCushion createAirCushion() {
return new AirCushionB();
}
@Override
public Material createMaterial() {
return new MaterialB();
}
}
//產品基類
public class AirCushion {
}
public class AirCushionA extends AirCushion{
public AirCushionA() {
System.out.println("製造氣墊A");
}
}
public class AirCushionB extends AirCushion{
public AirCushionB() {
System.out.println("製造氣墊B");
}
}
public class Material {
}
public class MaterialA extends Material{
public MaterialA() {
System.out.println("使用A材料");
}
}
public class MaterialB extends Material{
public MaterialB() {
System.out.println("使用B材料");
}
}