第三方:工厂类,将客户端的产生对象与具体子类分离,提取 (解耦) 到专门的工厂类中产生对象。
1. 简单工厂模式
专门定义一个类用来创建其它类的实例,被创建的实例通常都具有共同的父类。即将客户端产生商品的行为 (也就是所谓的new对象
) 提取到一个新的类中,把这个类叫做工厂类。
- 特点:
① 一个抽象产品类 (接口,如computer)。
② 多个具体的产品类 (如MacbookPro,Surface)。
③ 一个工厂 (负责生产所有具体商品,客户端与工厂交互,不与具体产品交互)。
interface Computer {
void printComputer();
}
class Macbookpro implements Computer {
public void printComputer() {
System.out.println("This is a mac");
}
}
class Surface implements Computer {
public void printComputer() {
System.out.println("This is a surface");
}
}
class AlienWare implements Computer {
public void printComputer() {
System.out.println("This is a alienware");
}
}
//工厂类,专门用于生产电脑
class ComputerFactory {
//返回值是电脑
public static Computer getInstance(String str) {
if(str.equals("mac")) {
return new Macbookpro();
} else if(str.equals("surface")) {
return new Surface();
} else if(str.equals("alienware")) {
return new AlienWare();
} else {
System.out.println("没有找到指定商品!!!");
return null;
}
}
}
public class Client {
public static void main(String[] args) {
Computer computer = ComputerFactory.getInstance(args[0]);
computer.printComputer();
}
}
这里我们相当于是创建生产电脑的工厂,客户需要购买什么样的电脑,只要输入类型编号就可以获取该电脑。将类的实例化交给工厂易于解耦。
- 优点:简单易于实现,把类的实例化交给工厂,易于解耦。
- 缺点:添加具体产品需要修改工厂违反OCP开放封闭原则。
2. 工厂方法模式
当多个产品呈现出家族式特征时(如微软系、苹果系),为了保证不同产品系之间的隐私性,不同产品系有自己的工厂。
- 特点:
① 一个抽象产品类 (接口,如computer)。
② 多个具体的产品类 (如MacbookPro,Surface)。
③ 一个抽象工厂。
④ 多个具体工厂 (如微软工厂、苹果工厂)。
interface Computer {
void printComputer();
}
class Macbookpro implements Computer {
public void printComputer() {
System.out.println("This is a mac");
}
}
class Surface implements Computer {
public void printComputer() {
System.out.println("This is a surface");
}
}
interface ComputerFactory {
Computer creatComputer();
}
class AppleFactory implements ComputerFactory {
public Computer creatComputer() {
return new Macbookpro();
}
}
class MsFactory implements ComputerFactory {
public Computer creatComputer() {
return new Surface();
}
}
public class Client1 {
public static void main(String[] args) {
Computer computer = new AppleFactory().creatComputer();
computer.printComputer();
}
}
工厂方法模式是针对每个产品提供一个工厂类,在客户端中判断使用哪个工厂类去创建对象。
- 优点:
① 降低了代码耦合度,对象的生成交给子类去完成;
② 实现了开放封闭原则,即每次添加子产品,不需要修改原有代码。 - 缺点:
① 增加了代码量,每个具体产品都需要一个具体工厂 ;
② 当增加抽象产品也就是添加一个其他产品族时需要修改工厂,违背了OCP原则。