java-设计模式-4-创建型模式-工厂
java-设计模式-4-创建型模式-工厂(简单工厂,工厂方法,抽象工厂)
工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。
简单工厂
分析:
Factory: 工厂角色
Product:抽象产品角色
ConcreteProduct:具体产品角色
//工厂角色
public class CarFactory {public CarProduct newCar(String name){//核心代码。if("xm".equals(name)){return new XMProduct();}else if("tsl".equals(name)){return new TSLProduct();}return null;}public static void main(String[] args) {CarFactory carFactory = new CarFactory();CarProduct xmCP = carFactory.newCar("xm");CarProduct tslCP = carFactory.newCar("tsl");xmCP.run();tslCP.run();}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品
class XMProduct extends CarProduct{public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct{public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
工厂方法
分析:
四个角色
Product:抽象产品
ConcreteProduct:具体产品
Factory:抽象工厂
ConcreteFactory:具体工厂
public class MainTest {public static void main(String[] args) {AbstractFactory carFactory = new BJXMFactory();CarProduct carProduct = carFactory.newCar();carProduct.run();AbstractFactory tslCarFactory = new BJTSLFactory();CarProduct tslCarProduct = tslCarFactory.newCar();tslCarProduct.run();}
}
//抽象工厂
abstract class AbstractFactory{public abstract CarProduct newCar();
}
//抽象工厂的具体产品1
class BJXMFactory extends AbstractFactory{public CarProduct newCar() {return new XMProduct();}
}
//抽象工厂的具体产品2
class BJTSLFactory extends AbstractFactory{@Overridepublic CarProduct newCar() {return new TSLProduct();}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品1
class XMProduct extends CarProduct {public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
缺点:系统复杂度增加,产品单一
抽象工厂
//抽象工厂
public abstract class AbstractFactory {//生成车产品abstract CarProduct newCar();//生成口罩产品,抽象工厂abstract Mask newMask();public static void main(String[] args) {AbstractFactory whMaskFactory = new WHMaskFactory();Mask mask = whMaskFactory.newMask();mask.protectMe();System.out.println("====================");AbstractFactory bjxmCarFactory = new BJXMCarFactory();CarProduct carProduct = bjxmCarFactory.newCar();carProduct.run();}
}
//具体工厂
class WHMaskFactory extends AbstractFactory{@OverrideCarProduct newCar() {return null;}@OverrideMask newMask() {return new N95Mask();}
}
//具体工厂
class BJXMCarFactory extends AbstractFactory{@OverrideCarProduct newCar() {return new XMProduct();}@OverrideMask newMask() {return null;}
}//口罩抽象类
abstract class Mask{public String price;public abstract void protectMe();
}
class N95Mask extends Mask{public N95Mask(){this.price = "1元";}@Overridepublic void protectMe() {System.out.println("价格:"+this.price);System.out.println("N95保护我");}
}
class CommonMask extends Mask{public CommonMask(){this.price = "0.5元";}@Overridepublic void protectMe() {System.out.println("价格:"+this.price);System.out.println("普通口罩保护我");}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品
class XMProduct extends CarProduct {public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
工厂模式的退化
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
java应用场景
NumberFormat、SimpleDateFormat