前言
工厂模式?工厂是用来生产产品的,那在我们java程序猿眼中,有什么是需要进行生产的的了?java是面向对象的语言,是不是想到了!没错就是生产对象的!!!以后我们就不用自己手动new对象了,告诉工厂我要对象,工厂就给你发一个,哈哈哈!
我们问什么要用工厂生产对象了了?new对象不也挺香的吗,咱们有构造方法呀!但是有没有考虑过这样一个问题:希望能够创建一个对象,但创建过程比较复杂,或者我们希望对外隐藏这些细节。如果不复杂,用构造函数就够了。比如你想用一个HashMap时也要搞一个factory,这就傻了!
java线程池和Spring中就有工厂模式
我们将在接下来详细介绍:
- 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)
- 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
- 抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂称为其他工厂的工厂。
工厂模式
一、原始方法
public class Original {
public static void main(String[] args) {
// 接口,所有实现类
Hero Hero = new Galen();
Hero Hero2 = new Dreus();
Hero.name();
Hero2.name();
// Hero Hero = HeroFactory.getHero("五菱");
// Hero.name();
}
}
interface Hero{
public void name();
}
class Galen implements Hero{
@Override
public void name() {
System.out.println("德玛西亚!!!");
}
}
class Dreus implements Hero{
public void name(){
System.out.println("诺克萨斯!!!");
}
}
//运行结果
德玛西亚!!!
诺克萨斯!!!
二、静态工厂
代码示例:。
public class StaticTest {
public static void main(String[] args) {
Hero Hero = HeroFactory.getHero("德玛西亚");
Hero Hero2 = HeroFactory.getHero("诺克萨斯");
Hero.name();
Hero2.name();
}
}
class HeroFactory{
public static Hero getHero(String hero){
if(hero.equals("德玛西亚")){
return new Galen();
}else if(hero.equals("诺克萨斯")){
return new Dreus();
}else {
return null;
}
}
//方法二
// public static Hero getGalen(){
// return new Galen();
// }
// public static Hero getDreus(){
// return new Dreus();
// }
}
//运行结果
德玛西亚!!!
诺克萨斯!!!
在这种工厂实现的情况下增加新的产品(类)实现起来会比较复杂。需要修改HeroFactory类,因此违反了开闭原则。虽然静态方法比原始方法添加新的类不需要修改内部逻辑、但是本质上都是需要在原来代码的基础上增加新的代码才能添加新的产品(类)。
三、简单工厂
简单工厂实际上就是围绕一个大工厂,建立许多小工厂。
//大工厂
interface HeroFactory{
Hero getHero();
}
//小工厂
class GalenFactory implements HeroFactory{
@Override
public Hero getHero() {
return new Galen();
}
}
//小工厂
class DreusFactory implements HeroFactory{
@Override
public Hero getHero() {
return new Dreus();
}
}
//新增一个英雄
class Arilia implements Hero{
@Override
public void name() {
System.out.println("艾欧里亚!!!");
}
}
//新增一个英雄工厂
class AriliaFactory implements HeroFactory{
public Hero getHero(){
return new Arilia();
}
}
//主程序
public class Simple {
public static void main(String[] args) {
Hero Hero = new GalenFactory().getHero();
Hero Hero2 = new DreusFactory().getHero();
Hero.name();
Hero2.name();
Hero Hero3 = new AriliaFactory().getHero();
Hero3.name();
}
}
//运行结果
德玛西亚!!!
诺克萨斯!!!
艾欧里亚!!!
我们新增一个英雄,不需要对已有代码进行任何修改,只需要添加一个新的子工厂。管理上十分简单。
四、抽象工厂
接下来重头系来了,抽象工厂。其实和简单工厂很像。我们依旧采用Hero()类进行演示:
//创建德玛西亚抽象类,内部可能包括盖伦,嘉文等
abstract class Demacia {
public abstract void name();
}
//创建盖伦类
class Galen extends Demacia{
@Override
public void name() {
System.out.println("德玛西亚!!!");
}
}
//创建嘉文类
class Gavin extends Demacia{
@Override
public void name() {
System.out.println("德玛西亚之我要当国王!!!");
}
}
//创建诺克萨斯类,内部可能包含德莱文,德莱厄斯
abstract class Knox{
public abstract void name();
}
//德莱厄斯类
class Dreus extends Knox{
@Override
public void name() {
System.out.println("诺克萨斯!!!");
}
}
//创建工厂类
class HeroFactory{
public static Demacia createDemacia(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
if("".equals(name) || name == null){
return null;
}
return (Demacia) Class.forName(name).newInstance();
}
public static Knox createKnox(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
if("".equals(name) || name == null){
return null;
}
return (Knox) Class.forName(name).newInstance();
}
}
//主程序
public class AbstractTest{
public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
Knox dreus = HeroFactory.createKnox("org.factory.abstrct.Dreus");
dreus.name();
Demacia galen = HeroFactory.createDemacia("org.factory.abstrct.Galen");
galen.name();
Demacia given = HeroFactory.createDemacia("org.factory.abstrct.Gavin");
given.name();
}
}
//运行结果
诺克萨斯!!!
德玛西亚!!!
德玛西亚之我要当国王!!
这就是抽象工厂了。有没有很熟悉!!!我们java程序猿在使用Spring框架的时候,是不是经常要写bean配置文件,或者加注解在需要的创建bean的类上面?没错了,Spring的bean创建方式就是用的抽象工厂,创建好的bean再交给BeanFactory存放。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。