简单工厂模式
简单工厂模式不满足开闭原则,每添加一个新的类型产品就需要修改工厂类。
//抽象产品接口
public interface Car {
}
//具体产品类
public class ACar implements Car{
}
public class BCar implements Car{
}
工厂类
public class CarFactory {
public static Car createCar(String type){
if (type.equals("A")) {
return new ACar();
} else if (type.equals("B")) {
return new BCar();
}
return null;
}
}
工厂方法设计模式
-
用途:将对象创建延迟到子类。
-
示例:
- JDK:
Collection.iterator()(不同集合返回不同的迭代器) - Spring:
BeanFactory(getBean()是工厂方法) - Log4j:
LoggerFactory.getLogger()对于工厂方法设计模式,在新增新的产品时只需要创建新的产品类及对应工厂类,每种产品类都有自己的工厂类,满足开闭原则。
- JDK:
//抽象产品接口
public interface Car {
}
//具体产品类
public class ACar implements Car{
}
public class BCar implements Car{
}
//抽象产品工厂
public interface CarFactory {
Car createCar();
}
//具体产品工厂
public class ACarFactory implements CarFactory{
public Car createCar() {
return new ACar();
}
}
public class BCarFactory implements CarFactory{
public Car createCar() {
return new BCar();
}
}
抽象工厂模式
-
用途:创建相关对象族。
-
示例:
- JDK:
javax.xml.transform.TransformerFactory.newInstance() - Spring:
ListableBeanFactory(生产多种类型的 Bean)
- JDK:
抽象工厂提供对象创建的方法,但是并不是每个具体工厂都要实现每个方法,每个工厂只重写实现自己需要的方法完成产品的创建,这样可以满足不同工厂之间产品不一致的情况。比如A工厂生产汽车,手机,而B工厂只生产手机,这样B工厂只重写生产手机的方法,如果B工厂也要生产汽车即重写奇对应方法即可。(以上仅是自己看了AQS的tryAquire()方法的实现后的想法,选择性重写,如果不对希望大家可以指正)
//抽象产品
public interface Car {
}
public interface Phone {
}
A企业的产品
public class ACar implements Car{
}
public class APhone implements Phone{
}
B企业的产品
public class BCar implements Car{
}
public class BPhone implements Phone{
}
C企业的产品
public class CCar implements Car{
}
//抽象工厂
public abstract class Factory {
public final Car createCar(){
Car car=tryCreateCar();
if (car==null){
throw new UnsupportedOperationException("如需要请自行实现");
}
return car;
}
protected Car tryCreateCar() {
return null;
}
public final Phone createPhone(){
Phone phone=tryPhone();
if (phone==null){
throw new UnsupportedOperationException("如需要请自行实现");
}
return phone;
}
protected Phone tryPhone() {
return null;
}
}
A工厂类
public class AFactory extends Factory{
@Override
protected Car tryCreateCar() {
return new ACar();
}
@Override
protected Phone tryPhone() {
return new APhone();
}
}
B工厂类
public class BFactory extends Factory{
@Override
protected Phone tryPhone() {
return new BPhone();
}
@Override
protected Car tryCreateCar() {
return new BCar();
}
}
C工厂类,C工厂只生产汽车
public class CFactory extends Factory{
@Override
protected Car tryCreateCar() {
return new CCar();
}
}