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 = "小米汽车";}
@Override
public void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct{
public TSLProduct(){this.name = "特斯拉";}
@Override
public 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{
@Override
public CarProduct newCar() {return new TSLProduct();}
}
//抽象产品角色
abstract class CarProduct{
public String name;
public abstract void run();
}
//抽象产品的具体产品1
class XMProduct extends CarProduct {
public XMProduct(){this.name = "小米汽车";}
@Override
public void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {
public TSLProduct(){this.name = "特斯拉";}
@Override
public 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{
@Override
CarProduct newCar() {
return null;
}
@Override
Mask newMask() {
return new N95Mask();
}
}
//具体工厂
class BJXMCarFactory extends AbstractFactory{
@Override
CarProduct newCar() {
return new XMProduct();
}
@Override
Mask newMask() {
return null;
}
}
//口罩抽象类
abstract class Mask{
public String price;
public abstract void protectMe();
}
class N95Mask extends Mask{
public N95Mask(){
this.price = "1元";
}
@Override
public void protectMe() {
System.out.println("价格:"+this.price);
System.out.println("N95保护我");
}
}
class CommonMask extends Mask{
public CommonMask(){
this.price = "0.5元";
}
@Override
public 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 = "小米汽车";}
@Override
public void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {
public TSLProduct(){this.name = "特斯拉";}
@Override
public void run() {System.out.println(this.name+"正在跑。");}
}
工厂模式的退化
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
java应用场景
NumberFormat、SimpleDateFormat