通过学习,一句话概括Java工厂模式的特点——通过建立一个工厂来创建对象,不必关心构造对象实例能不能被实例化啊等诸多细节和复杂过程。
工厂模式呢?就像我们从劳动密集型社会转型到技术密集型社会。打个比方,从前要制造一个桌子,从上山选木头、砍木头、运木头,到设计桌子,制造桌子等细节问题都需要一个人去做好,由于付出的劳动成本极高和技术学成的时间等问题,一般一个木匠在创新方面有一定的局限性。后来,人们步入了工业时代,制造业的发展突飞猛进,另外,倡导分工细化。比如,电脑的制造厂商,它懂得怎样装好一部电脑和谁的零部件做的好,这个电脑厂商不必知道每个零部件的制作细节,但是,一样可以制造出来性能优越(算是一种取最优吧)的电脑。
一、工厂模式
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
二、工厂模式分为三类
1.简单工厂模式(Simple Factory)
2.工厂方法模式(Factory Method)
3.抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类; 一个抽象工厂类,可以派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;一个抽象工厂类,可以派生出多个具体工厂类;每个具体工厂类可以创建多个具体产品类的实例。
三、简单工厂模式
建立一个工厂(一个函数或一个类方法)来制造新的对象。
代码实例:
public class Dog {
private String name;
private String address; void shout() {
System.out.println("汪汪汪~~");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
} class DogFactory {
static public Dog getDog() {
// return new Dog();
Dog dog = new Dog();
dog.setAddress("浙江杭州");
dog.setName("M.zhou");
return dog;
}
} class Test2 {
public static void main(String[] args) {
Dog dog = DogFactory.getDog();
Dog dog2 = DogFactory.getDog();
Dog dog3 = DogFactory.getDog(); System.out.println(dog == dog2); // false
}
}
四、工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
工厂方法模式组成:
1.抽象工厂角色:
工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2.具体工厂角色:
它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3.抽象产品角色:
它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4.具体产品角色:
具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来,前面学习过面向对象的三大特性,继承、封装和多态,工厂模式是将这三大特性集合起来的应用,同时工厂角色的结构也是符合开闭原则的。
下面举个例子:
/*
* @author M.zhou
* @date 2017-7-1 下午 18:59
* version 1.0
*
*/ //创建电脑制造工厂
public interface MyFactory {
public MyBattery createBattery(); // 定义创建电池 public MyDisplay createDisplay(); // 定义创建显示器 public MyMotherBoard createMotherBorad(); // 定义创建主板 public MyShell createShell(); // 定义创建外壳
}
//创建电脑原材料工厂,负责提供电池、显示屏、主板和外壳
public class ComFactory implements MyFactory { @Override
public <MyBattery> MyBattery createBattery() {
// TODO Auto-generated method stub
return new SuperBattery;
} @Override
public MyDisplay createDisplay() {
// TODO Auto-generated method stub
return new SuperDisplay;
} @Override
public MyMotherBoard createMotherBorad() {
// TODO Auto-generated method stub
return new SuperMotherBoard;
} @Override
public MyShell createShell() {
// TODO Auto-generated method stub
return new SuperShell;
}
}
//創建电脑装配厂的接口,只负责从原材料那里获取材料并配置成新型电脑。其他的它一概不管
public interface ComAssemblyPlant {
public Computer Assembley(); }
//新型电脑装配厂(可以根据市场需求,更换、升级零件,制造新型电脑)
public class NewComputerFactory implements ComAssemblyPlant {
MyFactory materialFactory; // 原料工厂 @Override public Computer Assembley() {
Computer computer=new Computer(); computer.setBattery(materialFactory.createBattery());
computer.setDisplay(materialFactory.createDisplay());
computer.setMotherBoard(materialFactory.createMotherBorad());
computer.setShell(materialFactory.createShell());
return computer; } }
Java基础——工厂模式的更多相关文章
-
JAVA基础--工厂模式
interface Fruit{ // 定义一个水果接口 public void eat() ; // 吃水果 } class Apple implements Fruit{ public void ...
-
!!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
-
一张图搞定Java设计模式——工厂模式! 就问你要不要学!
小编今天分享的内容是Java设计模式之工厂模式. 收藏之前,务必点个赞,这对小编能否在头条继续给大家分享Java的知识很重要,谢谢!文末有投票,你想了解Java的哪一部分内容,请反馈给我. 获取学习资 ...
-
Java抽象工厂模式
Java抽象工厂模式 基本定义 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 ...
-
Java的工厂模式(一)
Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...
-
Java简单工厂模式
Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...
-
Java 静态工厂模式的使用
多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...
-
从基础知识到重写Spring的Bean工厂中学习java的工厂模式
1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式: 单例模式是指控制其他对象获 ...
-
Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
随机推荐
-
UVa11427 Expect the Expected
数学期望 概率递推 每一天的概率都是独立且相同的.可以先推出每天打i盘赢j盘的概率f[i][j] f[i][j]=f[i-1][j]*(1-p) + f[i-1][j-1]*p 输 赢 设此人打一天胜 ...
-
【Linux_Fedora_应用系列】_4_安装chrome浏览器
在前面一篇文章中,我们讨论了在Linux Fedora 14下安装WMV解码器:[Linux_Fedora_应用系列]_3_如何利用Smplayer播放WMV格式的文件 在文章中介绍的方法同样适合FC ...
-
GoogleProgressBar
https://github.com/jpardogo/GoogleProgressBar
-
PHP开发Android应用程序(转)
第一部分是指在Android系统的手机上直接写PHP脚本代码并立即运行:第二部分则继续讲解如何把写好的PHP脚本代码打包成akp安装文件. 首先,在手机上安装两个apk包. 一个是SL4A(Scrip ...
-
php的redis的pconnect
1. 当使用pconnect时,连接会被重用,连接的生命周期是fpm进程的生命周期,而非一次php的执行. 2.如果代码中使用pconnect, close的作用仅是使当前php不能再进行redis请 ...
-
ACC起来后,usb检测不到
/proc/scsi/usb-storage 插入u盘,生成文件 /dev/sd* 节点路径 挂载方法 mkdir /media/sda1 mount /dev/sda1 /media/sda1 u盘 ...
-
Ubuntu部署可视化爬虫Portia2.0环境
部署portia环境官方文档给出的方法太过简单,对于初学者来说是很难根据那一两行字成功部署portia环境的.对于部署portia这只可爱的爬虫的过程还是有很多坑的,主要写一篇portia2.0版本的 ...
-
Ubuntu配置OpenStack 一:主机环境配置以及问题总结
本文包含openstack配置的实验环境的基本步骤.在下面的步骤中将逐步讲解如何操作. 1.准备三台虚拟机 主机名字分别命名为controller.network.computer[desktop版或 ...
-
VS2005的数据断点功能
多年前在VS2005强大的条件断点功能里面讨论过VS2005的条件断点功能. 其实在VS2005里面还有比较好用的(为什么我不用很牛逼呢?因为和OD比起来实在是太简陋了,但是使用上还是比较方便的)内存 ...
-
如何使用Python操纵Postgres数据库
pip install psycopg2 psycopg2-binary #!/usr/bin/python import psycopg2conn = psycopg2.connect(databa ...