xp做网站,深圳宝安做网站的公司,php学什么可以做网站,东道设计地址前言
在上一篇中我们学习了单例模式#xff0c;介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式#xff0c;主要分为简单工厂模式、工厂方法和抽象工厂模式。
简单工厂模式 简单工厂模式是属于创建型模式#xff0c;又叫做静态工厂方法模式。…前言
在上一篇中我们学习了单例模式介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式主要分为简单工厂模式、工厂方法和抽象工厂模式。
简单工厂模式 简单工厂模式是属于创建型模式又叫做静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。调用只需要告诉工厂类所需要的类型工厂类就会返回需要的产品类工厂的子类。 可以说是工厂模式中最简单的一种。 打个比方我们在电脑经常玩游戏我们只需要告诉电脑我们要玩什么游戏电脑就会打开这个游戏我们并不需要关心游戏是怎么运作的。 我们可以在以下的代码中进行相应的说明。
我们首先创建一个游戏总类接口包含一个玩游戏的方法 然后再由各自的游戏类继承该类并实现该类的方法最后在创建一个工程类根据不同的游戏进行创建对象。 那么实现的代码如下
代码示例
private static final String LOLLOL; private static final String DNFDNF; public static void main(String[] args) {Game game ComputerFactory.playGame(LOL);Game game2 ComputerFactory.playGame(DNF);game.play();game2.play();}
}interface Game{void play();
}class LOL implements Game{Overridepublic void play() {System.out.println(正在玩LOL...);}
}class DNF implements Game{Overridepublic void play() {System.out.println(正在玩DNF...);}
}class ComputerFactory{private static final String LOLLOL; private static final String DNFDNF; public static Game playGame(String game){if(LOL.equalsIgnoreCase(game)){return new LOL();}else if(DNF.equalsIgnoreCase(game)){return new DNF();}return null;} 输出结果
正在玩LOL...
正在玩DNF...我们在使用简单工厂模式进行实现该功能之后会发现我们将游戏类的实例化放到了工厂类中实现隐藏了对象创建的细节并且不需要知道是怎么玩的只需要知道调用该工厂类就行了。而且方便切换因为只需更改工厂类传递的类型值就行了。 但是我们也发现一个问题如果我们需要新增一个游戏类那么需要新定义一个接口然后还要在工厂类中添加一个判断分支如果少量的话还好但是大量的话就比较麻烦了并且这也违背了开放-封闭原则。
工厂方法模式 工厂方法模式是 Java 中最常用的设计模式之一属于创建型模式。定义一个创建对象的接口让其子类自己决定实例化哪一个工厂类工厂模式使其创建过程延迟到子类进行。 在简单工厂模式中我们发现在添加子类的时候相应的也需要在工厂类中添加一个判断分支是违背了开放-封闭原则的。而工厂方法模式就是主要解决这个问题的。
这里还是用上述的玩游戏示例只不过这里每个游戏都是由各自的游戏工厂类实现。主要区别就是由一个 工厂类变成了多个了降低了耦合度。如果新增一个游戏类相应的也只需在新增一个工厂类而已 并且完美的遵循了开放-封闭原则。
将上述代码更改之后相应的代码实现如下
代码示例 private static final String LOLLOL; private static final String DNFDNF; private static final String WOWWOW; public static void main(String[] args) {Game game3new LOLFactory().playGame();Game game4new DNFFactory().playGame();Game game5new WOWFactory().playGame();game3.play();game4.play();game5.play(); }interface Game{void play();
}class LOL implements Game{Overridepublic void play() {System.out.println(正在玩LOL...);}
}class DNF implements Game{Overridepublic void play() {System.out.println(正在玩DNF...);}
}class WOW implements Game{Overridepublic void play() {System.out.println(正在玩WOW...);}
}interface ComputerFactory2{Game playGame(String game);
}class LOLFactory implements ComputerFactory2{Overridepublic Game playGame() {return new LOL();}
}class DNFFactory implements ComputerFactory2{Overridepublic Game playGame() {return new DNF();}
}class WOWFactory implements ComputerFactory2{Overridepublic Game playGame() {return new WOW();}
}输出结果
正在玩LOL...
正在玩DNF...
正在玩WOW...可以看到使用工厂方法模式之后我们的代码更加清晰了扩展性也变高了如果想增加一个产品只要扩展一个工厂类就可以。但是随之而来的是在系统中增加了复杂度每增加一个产品时都需要增加一个具体类和对象实现工厂类。 所以在是否使用该模式需注意。 使用该模式比较经典的使用案例是大名鼎鼎的hibernate框架在选择数据库方言这块。但是如果直接简单的new一个对象的话则不必使用了若使用反而会增加系统的复杂度。
抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。也就是提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。 抽象工厂模式相比工厂方法模式来说更加复杂也更难理解但是更容易扩展。 抽象工厂模式就将同一类的产品子类归为一类让他们继承同一个抽象子类然后把它们当作一组然后再把多个组组成一个族。 打个比方还是上述的玩游戏我们可以把LOL和WOW当作PVP类型的游戏也可以把DNF和WOW当作PVE类型的游戏。
那么相应更改的代码如下
代码示例 private static final String LOLLOL; private static final String DNFDNF; private static final String WOWWOW; public static void main(String[] args) {ComputerFactory3 cf3new PVPFactory();cf3.playGame().play();cf3.playGame2().play();ComputerFactory3 cf4new PVEFactory();cf4.playGame().play();cf4.playGame2().play(); }
}interface Game{void play();
}class LOL implements Game{Overridepublic void play() {System.out.println(正在玩LOL...);}
}class DNF implements Game{Overridepublic void play() {System.out.println(正在玩DNF...);}
}class WOW implements Game{Overridepublic void play() {System.out.println(正在玩WOW...);}
}interface ComputerFactory3{Game playGame();Game playGame2();
}class PVPFactory implements ComputerFactory3{Overridepublic Game playGame() {return new LOL();}Overridepublic Game playGame2() {return new WOW();}
}class PVEFactory implements ComputerFactory3{Overridepublic Game playGame() {return new DNF();}Overridepublic Game playGame2() {return new WOW();}}输出结果
正在玩LOL...
正在玩WOW...
正在玩DNF...
正在玩WOW...在抽象工厂模式中可以在不需要知道产品是怎么样的只需知道是哪个工厂类就行了。我们也可以根据子类的共同的特性而将它们设计在一起组成一个相同类型组可以很方便的直接调用。但是相对的产品族比较难以扩展增加一个产品需要增加相应的接口和实现类。例如某个品牌的手机有不同系列每个系列有不同的型号如果只是增加型号的话比较容易但是相对的增加某个系列就比较麻烦了。 所以我们在使用抽象工厂模式也需要相应的结合实际场景来使用。