博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式-工厂模式
阅读量:6428 次
发布时间:2019-06-23

本文共 2842 字,大约阅读时间需要 9 分钟。

这篇文章介绍Java设计模式中的工厂模式,工厂模式抽象了对象创建的具体细节,创建的时候只需要用特定函数封装特定接口的创建细节。

主要举几个例子来说明:

一、简单工厂模式

  有一个Cat 和 Dog类,都实现了Animals接口,重写了 eat方法

1 public class Cat implements Animals {2     public void eat() {3         System.out.println("cat food");4     }    5 }
1 public class Dog implements Animals {2     public void eat() {3         System.out.println("dog food");4     }5 }
1 public interface Animals {2     void eat();3 }

  

  同时也有CatFactory 和 DogFactory 用于创建 Cat 和 Dog实例

1 public class CatFactory extends AnimalsFactory{2     @Override3     public Animals create() {4         Cat cat = new Cat();5         return cat;6     }7 }
1 public class DogFactory extends AnimalsFactory {2     @Override3     public Animals create() {4         Dog dog = new Dog();5         return dog;6     }7 }

  抽象出来一个AnimalsFactory,用于 动态绑定 到具体的Factory

1 public abstract class AnimalsFactory {2     public abstract Animals create();3 }

 

  分析使用这个简单工厂后对象的创建过程:

  1.先得到对应的工厂,猫有猫的工厂,狗有狗的工厂

  2.调用这个工厂的create方法,这里体现了多态,create调用的是 具体的工厂的create方法,返回的其实是具体的实例(Dog),但是我们这里用一个Animals去接收

  3.调用Animals的eat方法,这里同样体现多态,eat调用的 具体的实例的 eat方法(Dog.eat())

  

  工厂用于控制这个类的对象的创建过程(DogFactory用于控制创建 Dog 的过程)

1 /*简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。 2  * 该工厂只用于控制 这个类的对象的创建过程 3  *  4  * */ 5 public class TestAnimals { 6     public static void main(String[] args) {      7         AnimalsFactory factory = new DogFactory(); 8         //工厂在这里面起的作用,就是隐藏了创建过程的复杂度,我只要调用 工厂的create方法,就可以得到 9         //把new对象时的构造函数和参数屏蔽了10         //使用者再也不担心,对象是怎么创建的11         Animals animals = factory.create();12         animals.eat();13     }14 }

这样写的好处,

    1.工厂在这里面起的作用,就是隐藏了创建过程的复杂度,我只要调用 工厂的create方法,就可以得到,把new对象时的构造函数和参数屏蔽了,使用者再也不担心,对象是怎么创建的

    2.想要得到不同的对象,只要 将这个  ‘new  DogFactory()’替换,甚至在使用XML文件后,这里也不需要改

 

 

二、抽象工厂模式

抽象工厂用于控制多个类的一系列创建,是针对一系列产品,对这一系列产品的扩展和维护

但是无法针对 这一系列产品中的某产品进行控制(简单工厂做这个)

  Apple->Food

  Cat->Anilmals    ->defaultFactory->AbstractFactory

  AK47->Gun

 

在defaultFactory中完成了一系列对象的创建

1 public class DefaultFactory implements AbstractFactory { 2  3     public Animals createAnimals() { 4         return new Cat(); 5     } 6  7     public Food createFood() { 8         return new Apple(); 9     }10 11     public Gun createGun() {12         return new AK47();13     }14 }15

  可以创建另外一个如MyFactory,这个Factory用于创建另外的一系列的对象,如:Dog,Orange,AK74,

  后面要替换的话,也可以对这一系列产品一起替换,只需要将DefaultFactory 换成 MyFactory,

之后返回的对象都是 MyFactory 里创建的

1 /* 2  * 抽象工厂用于 用于控制多个类的 一系列创建 3  *  4  * 抽象工厂是针对  一系列产品,对这一系列产品的扩展和维护 5  *  6  * 但是无法针对 这 一 系列产品中的某个产品进行控制,(简单工厂做这个) 7  * */ 8 public class Test { 9     10     public static void main(String[] args) {11         AbstractFactory abstractFactort = new DefaultFactory();12         abstractFactort.createAnimals().eat();13         abstractFactort.createFood().printName();14         abstractFactort.createGun().shoot();15     }16     17 }

 

  

转载于:https://www.cnblogs.com/xuzekun/p/7466927.html

你可能感兴趣的文章
git使用教程2-更新github上代码
查看>>
张掖百公里,再次折戟
查看>>
SAP QM Batch to Batch的转移过账事务中的Vendor Batch
查看>>
本期最新 9 篇论文,帮你完美解决「读什么」的问题 | PaperDaily #19
查看>>
图解SSIS监视文件夹并自动导入数据
查看>>
Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
查看>>
MyBatis Review——开发Dao的方法
查看>>
技术研发国产化进程加快 看传感器企业如何展示十八般武艺
查看>>
技术助力第三次革命
查看>>
《HTML与CSS入门经典(第8版)》——2.6 总结
查看>>
在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
查看>>
大型网站的 HTTPS 实践(二):HTTPS 对性能的影响
查看>>
《Swift 权威指南》——第6章,第6.10节嵌套函数
查看>>
《自己动手做交互系统》——1.3 本章小结
查看>>
Mobile devices bundled with malware?
查看>>
《JavaScript面向对象精要》——1.5 访问属性
查看>>
《Python数据可视化编程实战》—— 第 1 章 准备工作环境
查看>>
【直播】APP全量混淆和瘦身技术揭秘
查看>>
10个大坑,当你产品上架AppStore会遇到
查看>>
【shell 脚本】两种登录方式
查看>>