java-设计模式-4-创建型模式-工厂

发布于:2025-09-03 ⋅ 阅读:(14) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到