目录
1、简单工厂模式(又称静态工厂方法模式)
由三部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、工厂(生成具体产品的实例)。缺点是扩展性差。
-
抽象产品,它一般是具体产品继承的父类或实现的接口。在java中由接口或者抽象类来实现。
-
具体产品,工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
-
工厂类,这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
(1) 抽象产品(手机)
public abstract class Phone {
public abstract void call();
}
(2) 具体产品(小米、华为、OPPO)
public class XiaoMi extends Phone {
@Override
public void call() {
System.out.println("小米");
}
}
public class HuaWei extends Phone {
@Override
public void call() {
System.out.println("华为");
}
}
public class Oppo extends Phone {
@Override
public void call() {
System.out.println("oppo");
}
}
(3) 工厂类1
public class SimplePhoneFactory {
public static Phone createPhone(String name) {
switch (name) {
case "xiaomi":
return new XiaoMi();
case "huawei":
return new HuaWei();
case "oppo":
return new Oppo();
}
}
}
缺点:扩展性差,增加一种手机时,不仅需要新增一个手机产品类,还需要修改createPhone ();不同的产品需要不同额外参数的时候不支持。
(4) 工厂类2
public static <T extends Phone> T createPhone(Class<T> clazz) {
T instance = null;
try {
instance = (T) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
优点:增加一种手机时,不需要修改createPhone ()
缺点:反射的效率问题;Class.forName(clazz.getName()).newInstance()调用的是无参构造函数生成对象,它和new Object()是一样的性质,而工厂应该用于复杂对象的初始化 ,当需要调用有参的构造函数时便无能为力了;不同的产品需要不同额外参数的时候不支持。
2、工厂方法模式
由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。工厂方法模式不仅将产品抽象出来,而且将工厂也抽象出来。
-
抽象产品:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
-
具体产品:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
-
抽象工厂:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
-
具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
优点:使一个产品类的实例化延迟到其具体工厂类;当需求变化,只需要增删相应的具体产品类和具体工厂类,不需要修改已有的类。而简单工厂需要修改工厂类的createPhone()方法。
缺点:引入抽象工厂层后,每次新增一个具体产品类,也要同时新增一个具体工厂类。
(1) 抽象产品(手机)
public abstract class Phone {
public abstract void call();
}
(2) 具体产品(小米、华为、OPPO)
public class XiaoMi extends Phone {
@Override
public void call() {
System.out.println("小米");
}
}
public class HuaWei extends Phone {
@Override
public void call() {
System.out.println("华为");
}
}
public class Oppo extends Phone {
@Override
public void call() {
System.out.println("oppo");
}
}
(3) 抽象工厂
public abstract class PhoneFactory {
public abstract Phone createPhone();
}
(4) 具体工厂(小米、华为、OPPO)
public class XiaoMiFactory extends PhoneFactory {
@Override
public Phone createPhone() {
return new XiaoMi();
}
}
public class HuaWeiFactory extends PhoneFactory {
@Override
public Phone createPhone() {
return new HuaWei();
}
}
public class OppoFactory extends PhoneFactory {
@Override
public Phone createPhone() {
return new Oppo();
}
}
3、抽象工厂模式
由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。抽象工厂模式适用于多个产品族(手机为一个产品族,电脑为另一个产品族,也就是说有多个抽象产品)
-
抽象产品:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
-
具体产品:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
-
抽象工厂:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
-
具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
(1) 抽象产品(手机)
public abstract class Phone {
public abstract void call();
}
(2) 具体产品(小米、华为、OPPO)
public class XiaoMi extends Phone {
@Override
public void call() {
System.out.println("小米");
}
}
public class HuaWei extends Phone {
@Override
public void call() {
System.out.println("华为");
}
}
public class Oppo extends Phone {
@Override
public void call() {
System.out.println("oppo");
}
}
(3) 抽象产品(电脑)
public abstract class Computer {
public abstract void Coding();
}
(4) 具体产品(dell、联想)
public class Dell extends Computer {
@Override
public void Coding() {
System.out.println("戴尔");
}
}
public class Lenovo extends Computer {
@Override
public void Coding() {
System.out.println("联想");
}
}
由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。抽象工厂模式适用于多个产品族(手机为一个产品族,电脑为另一个产品族,也就是说有多个抽象产品)
(5) 抽象工厂
public abstract class ITFactory {
public abstract Phone createPhone();
public abstract Computer createComputer();
}
(6) 具体工厂
public class MicrosoftFactory extends ITFactory {
@Override
public Phone createPhone() {
return new XiaoMi();
}
@Override
public Computer createComputer() {
return new Dell();
}
}
public class IBMFactory extends ITFactory {
@Override
public Phone createPhone() {
return new HuaWei();
}
@Override
public Computer createComputer() {
return new Lenovo();
}
}