工厂模式
通过一个新类赋值对象实例化,保证开闭原则和单一职责原则,
简单工厂模式 通过静态方法创建实例叫静态工厂模式
对实现的逻辑进行封装,通过暴露公共接口提供对象的实例化。如下图,但是这种工厂模式在新增加一个新类是,会打破开闭原则
Car 源码如下
package szms.gc;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class Car {
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
CarTwo 源码如下
package szms.gc;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class CarThree extends Car {
private String top;
public String getTop() {
return top;
}
public void setTop(String top) {
this.top = top;
}
}
CarThree源码如下
package szms.gc;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class CarThree extends Car {
private String top;
public String getTop() {
return top;
}
public void setTop(String top) {
this.top = top;
}
}
CarFactory.java 源码如下
package szms.gc;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class CarFactory {
public static Car createCar(String name) {
if(name.equals("CarTwo")) {
return new CarTwo();
}else if(name.equals("CarThree")) {
return new CarThree();
}else {
return null;
}
}
}
测试
反射类注册的简单工厂模式
反射需要运行时权限,反射机制会降低运行效率
CarFactory.java 源码如下
package szms.gc;
import java.util.HashMap;
import java.util.Map;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class CarFactory {
@SuppressWarnings("rawtypes")
private Map<String, Class> registeredCars = new HashMap<String, Class>();
@SuppressWarnings("rawtypes")
public void registeredCar(String name, Class carClass) {
registeredCars.put(name, carClass);
}
public Car createCar(String name){
Class cls = registeredCars.get(name);
try {
return (Car) cls.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
新建一个CarFore.java类
测试
添加抽象newInstance方法进行类注册的简单工厂模式
Car.java添加抽象方法
abstract public Car newInstance();
CarTwo.java
CarFactory.java如下
测试
方法工厂模式
在静态工厂模式的基础上创建抽象工厂类 ,方法工厂模式中创建实例的工厂类只有一个抽象方法,在不同的具体工厂类中分别对抽象类进行实例化。
MainFactory类代码如下
package szms.gc;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-03
*/
public abstract class MainFactory {
protected abstract Car createCar(String item);
}
CarFactory extends MainFactory 代码如下
package szms.gc;
import java.util.HashMap;
import java.util.Map;
/**
* 作者:羊先生
* 邮箱:785833476@qq.com
* @2021-08-02
*/
public class CarFactory extends MainFactory{
@SuppressWarnings("rawtypes")
private Map<String, Car> registeredCars = new HashMap<String, Car>();
@SuppressWarnings("rawtypes")
public void registeredCar(String name, Car carClass) {
registeredCars.put(name, carClass);
}
public Car createCar(String name){
return registeredCars.get(name).newInstance();
}
}
抽象工厂模式
在工厂方法模式下扩展,在抽象工厂类中有多个方法创建抽象类的实例化,继承抽象工厂类的创建抽象类实例化的工厂类可以有创建多个抽象类的实例化