目录
一、简单工厂模式
1、介绍
简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。简单工厂模式的创建目标,而这些产品类都是来自同一个接口或者父类。工厂类是整个模式的关键所在,它包含必要的判断逻辑,同时也能根据外界给定的信息去决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。就像买电脑一样,客户只需要关注电脑个体即可,不需要对于电脑怎么组装的有十分详致的了解。
2、案例
假设客户需要购买电脑,在客户端只需要输入自己想要的类型即可获取到想要的电脑,而类的实例化交给了工厂。我们可以用代码简单模拟这个场景:
interface IComputer{
void produce();
}
class Dell implements IComputer{
@Override
public void produce() {
System.out.println("戴尔,激发无限");
}
}
class Lenovo implements IComputer{
@Override
public void produce() {
System.out.println("联想在你身边");
}
}
class ComputerFactory{
public static IComputer makeComputer(String name){
if("dell".equals(name)){
return new Dell();
}else if("lenovo".equals(name)){
return new Lenovo();
}
return null;
}
}
public class FactoryMode {
public static void main(String[] args) {
IComputerFactory computer = new DellFactory();
computer.makeComputer();
}
}
3、总结
(1)使用场景:适用于产品对象较少,且产品需求固定的情况。
(2)优点:简单易于实现;将类的实例化交给工厂,实现解耦。
(3)缺点:添加具体产品需要修改工厂,电脑厂家有很多,每一个品牌的电脑,我们都要去添加一条判断语句,这就违反了OCP原则。
二、工厂方法模式
1、介绍
工厂方法模式是简单工厂的进一步抽象和推广。该模式是针对每个产品提供一个共续航类,在客户端去判断要是用哪个工厂去创建对象。工厂方法模式对简单工厂模式进行了抽象,有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
2、案例
还是以电脑为例,对于Dell类和Lenovo类有自己的工厂,而这两个具体工厂类需要继承抽象工厂类ComputerFactory,具体如下:
interface IComputer{
void produce();
}
class Dell implements IComputer{
@Override
public void produce() {
System.out.println("戴尔,激发无限");
}
}
class Lenovo implements IComputer{
@Override
public void produce() {
System.out.println("联想在你身边");
}
}
interface IComputerFactory{
IComputer makeComputer();
}
class DellFactory implements IComputerFactory{
@Override
public IComputer makeComputer() {
return new Dell();
}
}
class LenovoFactory implements IComputerFactory{
@Override
public IComputer makeComputer() {
return new Lenovo();
}
}
public class FactoryMode {
public static void main(String[] args) {
IComputer dell = new DellFactory().makeComputer();
dell.produce();
IComputer lenovo = new LenovoFactory().makeComputer();
lenovo.produce();
}
}
3、总结
(1)使用场景:一个类希望由子类来指定它所创建的对象;类将创建对象的职责委托给多个帮助子类中的某一个来完成。
(2)优点:每个具体工厂类只完成单一任务,代码简洁;满足了OCP,具有良好的扩展性。
(3)缺点:如果需要添加多个产品类的时候,那么就要对工厂类进行修改。比如说,每增加一个产品,相应的也要增加一个子工厂,这样就增加了额外的开发量。
三、抽象工厂模式
1、介绍
抽象工厂模式是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。抽象工厂模式在有多个业务品种、业务分类时,就可产生需要的对象。简单来说:当工厂只生产一个产品的时候,就是工厂方法模式,但如果需要生产两个或两个以上的商品的时候就是抽象工厂模式。
2、案例
我们接着上面的电脑的例子来讲,现在Dell电脑不仅要生产电脑,还要生产自己的鼠标,那应该怎么实现?请看下面代码:
package mode;
interface IComputer{
void produce();
}
class Dell implements IComputer{
@Override
public void produce() {
System.out.println("戴尔,激发无限");
}
}
class Lenovo implements IComputer{
@Override
public void produce() {
System.out.println("联想在你身边");
}
}
interface IMouse{
void selfMouse();
}
class DellMouse implements IMouse{
@Override
public void selfMouse() {
System.out.println("Dell自制鼠标");
}
}
class LenovoMouse implements IMouse{
@Override
public void selfMouse() {
System.out.println("联想鼠标,智享美好生活");
}
}
interface IComputerFactory{
IComputer makeComputer();
IMouse makeMouse();
}
class DellFactory implements IComputerFactory{
@Override
public IComputer makeComputer() {
return new Dell();
}
@Override
public IMouse makeMouse() {
return new DellMouse();
}
}
class LenovoFactory implements IComputerFactory{
@Override
public IComputer makeComputer() {
return new Lenovo();
}
@Override
public IMouse makeMouse() {
return new LenovoMouse();
}
}
public class FactoryMode {
public static void main(String[] args) {
IComputerFactory computer = new DellFactory();
computer.makeComputer();
computer.makeMouse();
}
}
3、总结
(1)使用场景:多个产品族的生产。
(2)优点:实现多个产品族(相关联产品组成的家族)。
(3)缺点:假如某个具体的产品类需要进行修改,那么有可能也要修改与之对应的工厂类。当需要修改多个产品类的时候,此时对工厂类的修改会变得相当麻烦。
四、工厂模式的应用
Calendar类(日历类,简单工厂模式):
首先,getInstance()方法作为Canlendar的静态方法,用于返回一个创建好的对象实例,具体的创建过程交给了createCalendar类去完成。如下图: