参考博客来源:https://www.jianshu.com/p/d951ac56136e
我们常说的工厂模式,在网上我们常见的资料是常见的三种模式
简单工厂模式
工厂方法模式
抽象工厂模式
下面我们具体的实现我们上面说的这三种模式以及他们的区别于共同点了
简单工厂模式:就是在调用工厂类的方法时,根据传参的条件可以生产出具体的产品类来,主要的特点就是根据不同的条件具体生产出不同的产品类型
在下面的代码中具体的角色有三个
抽象产品
具体产品
工厂
代码如下:
/**
* @Author: Jason
* @Create: 2019/12/22 18:38
* @Description 工厂模式中的抽象产品类
抽象产品
*/
public abstract class Product {
/**
* 提供一个生产抽象产品的方法
*/
public abstract void intro();
}
//下面的两个类都是属于具体产品
/**
* @Author: Jason
* @Create: 2019/12/22 18:41
* @Description 食品-牛肉产品
*/
public class FoodProduct extends Product {
@Override
public void intro() {
System.out.println("这是生产牛肉的");
}
}
/**
* @Author: Jason
* @Create: 2019/12/22 18:42
* @Description 猪肉生产类
*/
public class PigProduct extends Product {
@Override
public void intro() {
System.out.println("这是生产猪肉的");
}
}
/**
* @Author: Jason
* @Create: 2019/12/22 18:44
* @Description 工厂只是提供生产类
工厂类,根据不同的入参参数生产出具体的类型
*/
public class FoodFactory {
//提供一个对外开放的方法来生产类
public static Product getInstance(String str){
switch (str){
case "food":
return new FoodProduct();
case "pig":
return new PigProduct();
default:
return null;
}
}
}
工厂模式中其实就是我们常说的工厂模式:也就是说如果你需要生产一个产品,那必须同时购买生产产品的工厂
在这里面主要有四个概念:
抽象产品:
具体产品:
抽象工厂:
具体工厂:
具体的代码如下:
/**
* @Author: Jason
* @Create: 2019/12/22 18:44
* @Description 工厂只是提供生产类
*/
public abstract class FoodFactory {
/**
* 只是负责生产具体的猪肉
* @return
*/
abstract Product getInstance();
}
/**
* @Author: Jason
* @Create: 2019/12/22 19:03
* @Description 猪肉工厂
*/
public class PigFactory extends FoodFactory{
@Override
Product getInstance() {
return new PigProduct();
}
}
/**
* @Author: Jason
* @Create: 2019/12/22 18:41
* @Description 食品-牛肉产品
*/
public class FoodProduct extends Product {
@Override
public void intro() {
System.out.println("这是生产牛肉的");
}
}
//总结我们能够看出:相比较简单工厂模式而言,工厂方法就是一个工厂只能生产一类的食品类型
抽象工厂模式:根据具体的工厂可以生产出不同的产品,这也是包括一些相同系列的产品
关键的几个概念:
抽象产品
具体产品
抽象工厂
具体工厂:
产品系列类:
具体的代码如下:
/**
* @Author: Jason
* @Create: 2019/12/22 18:42
* @Description 猪肉生产类
*/
public abstract class PigProduct extends Product {
@Override
public abstract void intro();
}
/**
* @Author: Jason
* @Create: 2019/12/22 18:41
* @Description 食品-牛肉产品-再次抽象
*/
public abstract class FoodProduct extends Product {
@Override
public abstract void intro();
}
/**
* @Author: Jason
* @Create: 2019/12/22 19:24
* @Description 黄牛产品-具体产品
*/
public class YellowBeer extends FoodProduct {
@Override
public void intro() {
System.out.println("这是黄牛产品");
}
}
/**
* @Author: Jason
* @Create: 2019/12/22 19:25
* @Description 黑猪产品
*/
public class BlackPigProduct extends PigProduct {
@Override
public void intro() {
System.out.println("这是黑猪产品");
}
}
/**
* @Author: Jason
* @Create: 2019/12/22 18:44
* @Description 工厂只是提供生产类
*/
public abstract class FoodFactory {
/**
* 只是负责生产具体的猪肉
* @return
*/
abstract Product getInstance();
/**
* 负责生产具体的牛肉
*/
abstract Product getBeer();
}
/**
* @Author: Jason
* @Create: 2019/12/22 19:06
* @Description 牛肉
*/
public class BeerFactory extends FoodFactory {
@Override
Product getInstance() {
return new YellowBeer();
}
@Override
Product getBeer() {
return new BlackPigProduct();
}
}