内容简介:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法与简单工厂
对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个 Case
分支条件,这违背了开放封闭原则,对修改也开放了。而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果电脑,则无需修改工厂类,直接创建产品即可。
角色
- Product :抽象产品类。
-
ConcreteProduct
:具体产品类,实现
Product接口。 -
Factory
:抽象工厂类,该方法返回一个
Product类型的对象。 -
ConcreteFactory
:具体工厂类,返回
ConcreteProduct实例。
工厂方法模式的简单实现
- 首先创建一个计算机的抽象产品类,其中有一个抽象方法用户启动计算机生产:
public abstract class Computer {
/**
* 产品的抽象方法,由具体的产品类实现
*/
public abstract void start();
}
复制代码
-
接着我们创建各个品牌的计算机,其都继承了自己的父类
Computer,并实现了父类的start方法。
public class LenovoComputer extends Computer {
@Override
public void start() {
System.out.println("联想计算机启动");
}
}
public class HpComputer extends Computer {
@Override
public void start() {
System.out.println("惠普计算机启动");
}
}
public class AsusComputer extends Computer {
@Override
public void start() {
System.out.println("华硕计算机启动");
}
}
复制代码
-
创建抽象工厂类,里面有一个
createComputer方法,用于生产各种品牌的计算机。
public abstract class ComputerFactory {
public abstract <T extends Computer> T createComputer(Class<T> clz);
}
复制代码
- 创建具体工厂,广大代工厂是一个具体的工厂,其继承抽象工厂,通过反射来生产不同厂家的计算机。
public class GDComputerFactory extends ComputerFactory {
@Override
public <T extends Computer> T createComputer(Class<T> clz) {
Computer computer = null;
String className = clz.getName();
try {
//通过反射来生产不同厂家的计算机
computer = (Computer)Class.forName(className).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return (T) computer;
}
}
复制代码
-
客户端调用,客户端创建
GDComputerFactory生产各种计算机。
public class Client {
public static void main(String[] args) {
ComputerFactory computerFactory = new GDComputerFactory();
LenovoComputer mLenovoComputer = computerFactory.createComputer(LenovoComputer.class);
mLenovoComputer.start();
HpComputer mHpComputer = computerFactory.createComputer(HpComputer.class);
mHpComputer.start();
AsusComputer mAsusComputer = computerFactory.createComputer(AsusComputer.class);
mAsusComputer.start();
}
}
复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。