第三方:工厂类,将客户端的产生对象与具体子类分离,提取(解耦)到专门的工厂中产生对象。
简单工厂模式:专门定义一个类用来创建其它类的实例,被创建的实例通常都具有共同的父类。
问题本质:主方法(客户端)直接与具体产品交互。
如何解决:将客户端产生商品的行为(new对象)提取到一个新的类中–>工厂类
思考以下情景:某同学去电脑商城买电脑,他特别喜欢两款电脑,一款是Mac,另一款是Win。
interface Computer{
void putComputer();
}
class Mac implements Computer{
public void putComputer(){
System.out.println("我要一台mac电脑");
}
}
class Win implements Computer{
public void putComputer() {
System.out.println("我想要一台win电脑");
}
}
public class Test {
public void print(Computer computer) {
computer.putComputer();
}
public static void main(String[] args) {
Test test = new Test();
test.print(new Mac());
}
}
运行结果:
考虑到顾客有可能做出其他选择,我们不得不返回客户端去改代码,为了方便进行我们程序设计人员,专门设定一个工厂类来创建其他类的实例,被创建的类通常有共同的父类。
//简单工厂类
class ComputerFactory{
public static Computer fun(String name){
Computer computer = null;
if(name.equals("mac")){
computer = new Mac();
}else if(name.equals("win")){
computer = new Win();
}
return computer;
}
}
public class Test{
public void print(Computer computer){
computer.putComputer();
}
public static void main(String[] args) {
Test test = new Test();
String answer = null;
System.out.println("请问您要什么型号的电脑?");
Scanner scanner = new Scanner(System.in);
answer = scanner.nextLine();
Computer computer = ComputerFactory.fun(answer);
test.print(computer);
}
}
从上我们可以得出简单工厂模式的特点:
① 有一个抽象产品类(如接口)
② 有多个具体的产品类(如Mac)
③ 有一个工厂类用来创建其他类的实例
简单工厂模式的缺点:违背了开闭原则(OCP)