您的位置 首页 java

Java基础知识,23种设计模式之工厂Factory,由浅入深层层推进

中国汉语博大精深,单从字面意思我们就知道工厂是什么意思?

Java 中,工厂的设计模式已在我们熟知的Sping IOC中应用,后续我会出源码相关的文章,感兴趣的朋友,记得关注哦。

切换至Java的世界一起来分析下 工厂模式 吧!

什么是工厂模式

任何可以产生对象的方法或类,都可以称之为工厂。

工厂模式的核心思想是,把原本new创建对象的方式,交由工厂去实现

这句话是不是很熟悉?

将创建对象的方式,交由容器来实现。这不就是我们熟知的Spring中的IOC吗?

为什么有了new之后,还要有工厂?

这是为了灵活的控制生产过程,有的时候我们生产一个对象想要控制它的权限,谁有权得到,谁无权得到。或者对它进行一些修饰,这就涉及到另外一种设计模式——装饰模式,或者生产过程中加一些日志。等……

静态工厂

上节提到的单例也是一种工厂,单例中的工厂我们称之为静态工厂。

   private   static  final SigletonV1 INSTANCE = new SigletonV1();  

简单工厂

我们回想一下,我们从小到大上学的过程。

小的时候离家比较近,我们可能步行,或者骑自行车;

上了高中的时候离家远了,可能需要坐汽车;

上了大学,我们可能跨省了,这个时候我们需要坐火车或飞机了。

随着距离的不同, 虽然我们乘坐的交通工具不同,但它们都具备一个特性,从一个地方把你送到另一个地方 。区别就是速度不同吧了。

我们把移动的属性抽出来,让不同的交通工具都去实现它,这就是简单工厂。

 public class TestMainOfFactory {
    public static void main(String[] args) {
        //上小学
        VehicleMethod v1 = new Bicycle();
        v1.move();
        //上高中
        VehicleMethod v2 = new Car();
        v2.move();
        //上大学
        VehicleMethod v3 = new Train();
        v3.move();
    }
}  

工厂方法FactoryMethod

还是拿上学去学校的例子,不同的交通工具都有自己的特性,随着速度的变快造价越来越高,舒适度也越来越好。这种描述如果只有一个move()方法就体现不出来了。

这个时候就需要在每种交通工具上加入更多的描述信息。就引出工厂方法了,即在new之前加入更多的控制,描述信息。

 public static void main(String[] args) {
    //上小学
    VehicleMethod v1 = new BicycleFactory().create();
    v1.move();
    //上高中
    VehicleMethod v2 = new CarFactory().create();
    v2.move();
    //上大学
    VehicleMethod v3 = new TrainFactory().create();
    v3.move();
}

运行结果:
造价300无,速度每小时30公里,舒适度低
BicyCle run ber ber ber...
造价250000无,速度每小时90公里,舒适度中
car run dididi...
造价3亿,速度每小时300公里,舒适度高
Train run guangguangguang...  

产品工厂的特点:产品维度扩展方便

抽象工厂

抽象工厂的理解核心为,一个大的抽象工厂包含了抽象的实现方法,分别由不同的类来继承返回不同的Vo对象。

大家好好理解下啊,这个设计很巧妙,把一组方法的实现归为一类,某一组类上边是抽象方法,下面是具体的类。当修改返回不同的实现类时,只需要改一个地方即可全局替换。

例:当为小学生时

 public class TestMain {
    public static void main(String[] args) {
        StudentAbstractFactory s = new PupilFactory();
        Eat eat = s.createEat();
        Drink drink = s.createDrink();
        Play play = s.createPlay();
        eat.eatWhat();
        drink.drinkWhat();
        play.plyWhat();
    }
}

输出结果:
吃馒头
喝白开水
玩泥巴  

假如要改为高中生呢,只需要将第3行的new PupilFactory替换为SeniorFactory即可实现。

 public class TestMain {
    public static void main(String[] args) {
        StudentAbstractFactory s = new SeniorFactory();
        Eat eat = s.createEat();
        Drink drink = s.createDrink();
        Play play = s.createPlay();
        eat.eatWhat();
        drink.drinkWhat();
        play.plyWhat();
    }
}

输出结果:
吃面包
喝矿泉水
玩篮球  

抽象工厂的特点:产品一族扩展方便,但 在产品 单一维度不好扩展

工厂模式的演进过程

回顾一下咱们工厂模式的演进过程。

任意定制交通工具

使其可以乘坐不同的交通工具上学。继承VehicleMethod。

任意定制生产过程

通过类中的抽象方法实现,不同的交通工具有自己独有的特性。XXXFactory.create()

任意定制产品一族

通过抽象工厂的两层嵌套,实现小学生,高中生属性上的多个不同的特性。

有没有被绕晕的感觉呢,这个工厂模式我可是足足学了好几天才理解透,建议大家上机敲一遍就会惊叹于设计模式的神奇之处。

想学习更多Java知识的小伙伴们,记得关注哦,后续内容会更加精彩。

文章来源:智云一二三科技

文章标题:Java基础知识,23种设计模式之工厂Factory,由浅入深层层推进

文章地址:https://www.zhihuclub.com/187712.shtml

关于作者: 智云科技

热门文章

网站地图