1

Java 23种设计模式之工厂模式

一:定义
工厂模式:定义一个创建产品对象的工厂接口,将产品产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中要求的“创建与使用相分离”的特点
按实际业务划分:简单工厂模式工厂方法模式抽象工厂模式
我们把创建的对象称为“产品”,把创建产品的对象称为“工厂”,如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”
在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)
简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度,违背了“开闭原则”
工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
二:简单工厂模式(Simple Factory Pattern)
模式结构
简单工厂模式的主要角色如下:
简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需要的产品对象
抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
具体产品(ConcreteProduct):是简单工厂模式的创建目标
image.png
代码实现:

//抽象产品接口
public interface Car {
    
    //生成小汽车
    void productCar();
}


//具体产品:奔驰车
public class BenChiCar implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成奔驰车");

    }
}


//具体产品宝马车
public class BaoMaCar  implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成宝马车");
    }
}

//工厂类生成产品的
public  class SimpleCarFactory {
    public  Car getCar(int a) {
        switch (a){
            case 0:
                return new BenChiCar();
            case 1:
                return new BaoMaCar();
            default:
               return null;
        }

    }
}

//使用

   try {
           Car car= new SimpleCarFactory().getCar(0);//拿到产品对象
           car.productCar();//调用方法
        } catch (Exception e) {
            e.printStackTrace();
        }

//结果
System.out: 我来具体生成奔驰车

二:工厂方法模式
工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
模式的结构
工厂方法模式的主要角色如下。
1.抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
2.具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3.抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4.具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
image.png
代码实现

//抽象产品接口
public interface Car {
    
    //生成小汽车
    void productCar();
}


//具体产品:奔驰车
public class BenChiCar implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成奔驰车");

    }
}


//具体产品宝马车
public class BaoMaCar  implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成宝马车");
    }
}

//抽象工厂

public interface AbstractFactory {
    //生产产品的方法
    public Car createCar();
}

//具体工厂的实现:宝马工厂
public class BaoMaFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        System.out.println("我是来宝马工厂创建宝马产品的");
        return new BaoMaCar();
    }
}

//具体工厂:奔驰工厂
public class BenChiFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        System.out.println("我是奔驰工厂创建奔驰产品的");
        return new BenChiCar();
    }
}

//调用
Car benCar= new BenChiFactory().createCar();
        benCar.productCar();
        Car baoCar= new BaoMaFactory().createCar();
        baoCar.productCar();
        
 //结果
 System.out: 我是奔驰工厂创建奔驰产品的
System.out: 我来具体生成奔驰车
System.out: 我是来宝马工厂创建宝马产品的
System.out: 我来具体生成宝马车

三:抽象工厂模式
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件。
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
系统一次只可能消费其中某一族产品,即同族的产品一起使用。
模式的结构
抽象工厂模式的主要角色如下。
1.抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
2.具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3.抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4.具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

image.png

代码实现

//抽象电视产品接口
public interface Tv {
    //生成电视
    void productTv();
}

//具体产品:奔驰电视
public class BenChiTv implements Tv{
    @Override
    public void productTv() {
        System.out.println("具体生产奔驰牌电视");
    }
}

//具体产品:宝马电视
public class BaomaTv  implements Tv{
    @Override
    public void productTv() {
        System.out.println("具体生产宝马牌电视");
    }
}

//抽象汽车产品接口
public interface Car {
    
    //生成小汽车
    void productCar();
}


//具体产品:奔驰车
public class BenChiCar implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成奔驰车");

    }
}


//具体产品宝马车
public class BaoMaCar  implements Car{
    @Override
    public void productCar() {
        System.out.println("我来具体生成宝马车");
    }
}

//抽象工厂,里面有生成汽车产品,有生成电视产品的方法
public interface AbstractFactory {
    //生产产品的方法
    public Car createCar();
    //生产产品电视的方法
    public Tv createTv();
}

//具体工厂:奔驰工厂
public class BenChiFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new BenChiCar();
    }

    @Override
    public Tv createTv() {
        return new BenChiTv();
    }
}

//具体工厂的实现:宝马工厂
public class BaoMaFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new BaoMaCar();
    }

    @Override
    public Tv createTv() {
        return new BaomaTv();
    }
}


//使用
  Car benCar= new BenChiFactory().createCar();
        benCar.productCar();
        Tv benTv= new BenChiFactory().createTv();
        benTv.productTv();
        Car baoCar= new BaoMaFactory().createCar();
        baoCar.productCar();
        Tv baoTv= new BaoMaFactory().createTv();
        baoTv.productTv();
        
  //结果
System.out: 我来具体生成奔驰车
System.out: 具体生产奔驰牌电视
System.out: 我来具体生成宝马车
System.out: 具体生产宝马牌电视

image.png
工厂模式一般结合动态代理和单例使用

END:奋斗是自有人类以来就生生不息的


Rocky_ruan
57 声望5 粉丝

不积跬步,无以至千里