它也叫做静态工厂模式,其实是不属于23种设计模式的。
他的实现主要就是
定义一个类,该类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例,其实就是将一个具体类的实例化交给一个类的静态方法来执行,(体现的是创建者和调用者分离)该类被称为工厂类,静态方法被称为静态工厂方法。
首先以买车为例 创建一个大家都熟悉的流程
先创建一个接口:
public interface Car { //有一个名字的属性 String name(); }
然后创建两个实体类:
public class Tesla implements Car{ @Override public String name() { return "特斯拉"; } }
public class WuLing implements Car{ @Override public String name() { return "五菱"; } }
创建消费者购买这两类车
public class Customer { public static void main(String[] args) { //然后作为消费者 需要买一辆五菱 买一辆特斯拉的话 //需要创建这两个实例对象 Car car1=new WuLing(); Car car2=new Tesla(); System.out.println(car1.name()); System.out.println(car2.name()); } }
但是这种基本模式下 有很大的缺点,就是实例化对象的时候都需要new一个,就好比买车的时候 就需要自己new一个想要的车,所以需要有工厂类的出现
模式图
CarFactory
public class CarFactory{ //简单静态工厂类 在这个地方进行new //在这个类里面 写一个静态方法 可以直接调用的 public static Car getCar(String name){ //但是我不知道是不是 异常 就是如果输入的车名是不一样的 if(name.equals("特斯拉")){ //那就创建特斯拉的车 return new Tesla(); }else if(name.equals("五菱")){ return new WuLing(); } //这里是防止出现一些没有名字的新车 return new Car() { @Override public String name() { return "无名"; } }; } }
FactoryCustomer
public class FactoryCustomer { public static void main(String[] args) { //这里就是调用那个工厂了 //先创建这个工厂类 Car car1=CarFactory.getCar("特斯拉"); Car car2=CarFactory.getCar("五菱"); Car car3=CarFactory.getCar("无名氏"); System.out.println(car1.name()); System.out.println(car2.name()); System.out.println(car3.name()); } }
但是这个简单工厂模式是不符合开闭原则的,也就是让我们又出现一辆新的车的时候,就需要在这个CarFactory这边进行对应增加if判断,所以简单工厂模式也算是静态工厂模式。不适合动态的增加
模型图:
其实简单来说 就是定义一个工厂接口,然后对每种车都进行实现工厂接口,变成专属自己的车工厂
先创建Car接口:
public interface Car { //有一个名字的属性 String name(); }
Tesla和WuLing两个实现类:
public class Tesla implements Car { @Override public String name() { return "特斯拉"; } }
public class WuLing implements Car { @Override public String name() { return "五菱"; } }
CarFactoryu接口
public interface CarFactory { //这个接口有一个方法 Car getCar(); }
Tesla工厂接口和WuLing工厂接口:
public class WuLingFactory implements CarFactory{ @Override public Car getCar() { return new WuLing(); } }
public class TeslaFactory implements CarFactory{ @Override public Car getCar() { //实现这个工厂接口 并创建一个对应的类 return new Tesla(); } }
最后是customer类
public class Customer { public static void main(String[] args) { //所以是需要和对应的工厂对接? 反正目的就是不需要new? //那这样子是不是 没必要呢 //但是这样new可以姑且理解为 new 一个车等于要造一个车,但是new一个工厂就是相当于找到一个4s店。。。 TeslaFactory teslaFactory=new TeslaFactory(); WuLingFactory wuLingFactory=new WuLingFactory(); Car car1=teslaFactory.getCar(); Car car2=wuLingFactory.getCar(); System.out.println(car1.name()); System.out.println(car2.name()); } }
这样的好处在于,满足了开闭原则,不需要再修改。但是需要每次进行添加: