概念
根据定义一个工厂父类来定义创建对象的公共接口,而子类负责生成特定对象。
工厂模式主要分为普通工厂模式(又叫简单工厂模式)、工厂方法模式和抽象工厂模式这三种模式,下面我们针对每一种模式做一个详细说明。
工厂模式类型
1、普通工厂模式(简单工厂模式)
普通工厂模式也叫简单工厂模式,简单的说它就是创建了一个公共的接口工厂类,然后其他类都实现这个接口。
在该模式中,工厂类是整个模式的关键。它有着一个必要的判断逻辑,能够根据你的需要来创建所需要的实例。使用者使用的时候无序知道这些对象是怎么样创建的,也不用去关心这些。这有利于整个软件系统的优化构架。
但是他也有缺点,因为工厂类含有所有实例的创建逻辑,所以它不适合“高内聚”。还有当系统中特定产品类的数量增加时,可能需要工厂类也同样做出调整,因此它的可伸缩性和扩展性不好。
下面我举个栗子来说明一下:
1、创建一个公用的接口类
public interface SendMsg {
public void sendMsg();
}
2、分别创建两个实现类
public class SendMsg1 implements SendMsg {
@Override
public void sendMsg() {
System.out.println("this is SendMsg1 !");
}
}
public class SendMsg2 implements SendMsg {
@Override
public void sendMsg() {
System.out.println("this is SendMsg2!");
}
}
3、创建工厂类
public class SendFactory {
public SendMsg produce(String type) {
if ("sendMsg1".equals(type)) {
return new SendMsg1();
} else if ("sendMsg2".equals(type)) {
return new SendMsg2();
} else {
System.out.println("正在开发中!");
return null;
}
}
}
4、测试
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
SendMsg sendMsg = factory.produce("sendMsg1");
sendMsg.Send();
}
}
2、工厂方法模式
如果产品出现多个抽象时,我们就需要有多个产品接口,这个场景就是我们说的工厂方法模式或者叫多个工厂方法模式。
话不多说,我们只需要将上面SendFactory类的代码稍微改动下就行,直接上demo,如下所示
public class SendFactory {
public SendMsg produceSendMsg1(){
return new SendMsg1();
}
public SendMsg produceSendMsg2(){
return new SendMsg2();
}
}
测试
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
SendMsg sendMsg = factory.produceSendMsg1();
sendMsg.Send();
}
}
3、抽象工厂模式
抽象工厂是所有工厂模式中最抽象的一种形态。抽象工厂指多个抽象角色同时使用同一个工厂模式。使用他,我们只需要向客户端提供一个接口,使客户端能够在不指定特定产品的情况下能实现多个产品中的产品对象的创建。
产品类
//汽车品牌和汽车名
public interface Car {
}
public class CarA extends Car {
public CarA(){
System.out.println("丰田-->CarA");
}
}
public class CaeB extends Car {
public EngineB(){
System.out.println("本田-->CarB");
}
}
//手机和手机型号
public interface MobilePhone {
}
public class MobilePhoneA extends MobilePhone {
public MobilePhoneA(){
System.out.println("手机-->MobilePhoneA");
}
}
public class MobilePhoneB extends MobilePhone {
public MobilePhoneB(){
System.out.println("手机-->MobilePhoneB");
}
}
工厂类
//创建工厂的接口
public interface AbstractFactory {
//制造汽车
public Car createCar();
//制造手机
public MobilePhone createMobilePhone();
}
//丰田生产的车型
public class FactoryCarLeiling implements AbstractFactory{
@Override
public Car createCar() {
return new CarA();
}
@Override
public MobilePhone createMobilePhone() {
return new MobilePhoneA();
}
}
public class FactoryCarKaluola implements AbstractFactory {
@Override
public Car createCar() {
return new CarB();
}
@Override
public MobilePhone createMobilePhone() {
return new MobilePhoneB();
}
}
客户
public class Customer {
public static void main(String[] args){
FactoryCarLeiling factoryCarLeiling = new FactoryCarLeiling();
factoryCarLeiling.createCar();
factoryCarLeiling.createMobilePhone();
FactoryCarKaluola factoryCarKaluola = new FactoryCarKaluola();
factoryCarKaluola.createCar();
factoryCarKaluola.createMobilePhone();
}
}
总结
不管是简单工厂模式、工厂方法模式、还是抽象工厂模式,它们都属于工厂模式,而且他们的形态特征都非常的相似,它们的目的都是为了解耦。我们在使用时,不必在意到底使用哪个才好,我们只需要知道它能否达到降低耦合度的目的就行了。
原创声明:本文为【Java学习提升】原创博文,转载请注明出处。
本文来源于公众号:【Java学习提升】 专注于Java领域技术分享,Java知识体系学习、分享面试经验,让我们结伴而行,共同成长!