上一篇:单例模式
1.什么是工厂模式?
工厂模式是我们平时较常使用得一种设计模式,它实现了创建者与调用者分离。在工厂模式中,我们在创建对象得时候不会对客户端暴露创建逻辑,并且是通过使用一个共同得接口来指向新创建得对象。 太官方了,整不懂?大白话就是:你买一个手机,直接从手机生产商那里提货用就行了,不用去管它手机内部是怎么构建得,功能是怎么实现得。
2.什么时候使用工厂模式?
工厂模式并不是任何时候都适合使用的,工厂模式在创建复杂的对象的适合更加适合使用,如果是普通对象直接new
就完事了。因为使用工厂模式就需要引入一个工厂类
,增加了系统的复杂度。
3.工厂模式分类?
1.简单工厂模式
用来生产同一等级结构中的任意产品 。/**
*简单工厂---Car接口
*/
public interface Car {
void name();
}
public class BenChi implements Car {
@Override
public void name() {
System.out.println("奔驰车");
}
}
public class BaoMa implements Car {
@Override
public void name() {
System.out.println("宝马车");
}
}
/**
* 普通的方式---测试类
*/
public class Test {
public static void main(String[] args) {
Car car=new BenChi();
Car car1 = new BaoMa();
car.name();
car1.name();
}
}
将上面的测试类使用工厂模式来进行改造:
首先创建一个Car工厂类
,用于获取Car。
/**
* Car工厂类
*/
public class CarFactory {
//获取Car的方法
public static Car getCar(String carName) {
if (carName.equals("benchi")) {
return new BenChi();
} else if (carName.equals("baoma")) {
return new BaoMa();
} else {
return null;
}
}
}
然后编写测试类:
public class Test01 {
public static void main(String[] args) {
Car benchi = CarFactory.getCar("benchi");
Car baoma = CarFactory.getCar("baoma");
benchi.name();
baoma.name();
}
}
以上代码分别使用了普通new对象的方法获取车
和工厂模式获取车
两种不同的方式。
但是如果现在我们想要一个大众
车,那就需要去CarFactory
中修改逻辑代码,这不符合OOP
中的开闭原则(对扩展开放,对修改关闭),如果想要符合开闭原则
,方便横向扩展,则可以使用工厂方法模式
。
2.工厂方法模式
用来生产同一等级结构中的固定产品。1)修改CarFactory
,注意是interface
/**
* Car工厂类
*/
public interface CarFactory {
Car getCar();
}
2)创建一个新的BaoMaFactory
public class BaoMaFactory implements CarFactory {
@Override
public Car getCar() {
return new BaoMa();
}
}
3)创建一个新的BenChiFactory
public class BenChiFactory implements CarFactory {
@Override
public Car getCar() {
return new BenChi();
}
}
4)测试类
public class Test02 {
public static void main(String[] args) {
Car baoma = new BaoMaFactory().getCar();
Car benchi = new BenChiFactory().getCar();
baoma.name();
benchi.name();
}
}
使用此种模式代码量明显比第一种代码量多,但是此种方式方便我们横向扩展,此时如果我们需要的是大众
车,直接新创建一个DaZhongFactory
就行了,不需要去修改原来的代码,符合开闭原则
。
此种方式虽然满足了开闭原则
,能够非常简单的实现横向扩展,但是!
相信大家已经发现此种方式的弊端:如果我要10个车那就需要new 10个对应的车的工厂类。100个就需要100个对应车的工厂类……它让我们的整个项目体系更加复杂化了,所以工厂模式在实际的应用中简单工厂类
反而使用的较多。
3.抽象工厂模式
围绕一个超级工厂创建其他厂,这个超级工厂可以看作是其他工厂的工厂。 抽象工厂模式虽然也是工厂模式的一种,但是两者本质上还是有区别的。所以在设计模式中,我们也将抽象工厂模式
和工厂模式
分开为两种不同的创建对象的模式。