Java-工厂设计模式
文章部分摘自网络
引言:
工厂设计模式分为三种:
简单工厂
工厂方法
抽象工厂
联想四种情况
(1)、还没有工厂时代:假如还没有工业革命,如果一个客户要一件产品,一般的做法是客户去创建一件产品,然后拿来用。
(2)、简单工厂模式:后来出现工业革命。用户不用去创建产品。因为客户有一个工厂来帮他创建产品.想要什么产品,这个工厂就可以创建这种产品。比如想要一台洗衣机。工厂就创建这台洗衣机。即工厂可以创建产品。
(3)、工厂方法模式时代:为了满足客户,要求的产品越来越多,如洗衣机、电视机等系列,一个工厂无法创建所有的产品。于是由单独分出来多个具体的工厂。每个具体工厂创建一种产品。即具体工厂类只能创建一个具体产品。但是工厂还是个抽象。你需要指定某个具体的工厂才能生产产品出来。
(4)、抽象工厂模式时代:随着客户的要求越来越高,由于不同工厂的产品品质和功能不一样,客户希望生产好的电视机的厂商可以生产洗衣机。于是这个工厂开始生产电视机车和需要的洗衣机。
假设有三种产品:洗衣机、电视机和空调。
一、简单工厂模式(Simple Factory)
建立一个工厂(一个函数或一个类方法)来制造新的对象。
分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。但是客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了。为了降低耦合,就出现了工厂类,把创建产品的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的产品的类型就行了,而不必去知道创建的细节.这就是工业革命了:简单工厂模式
首先创建一个共同的产品接口
package com.gqx.Factory;
public interface Product {}
然后将洗衣机、电视机和空调去实现该接口
package com.gqx.SimpleFactory;
public class TV implements Product {
public TV(){
System.out.println("电视机被生产了!");
}
} package com.gqx.SimpleFactory;
public class Wash implements Product {
public Wash(){
System.out.println("洗衣机被生产了!");
}
} package com.gqx.SimpleFactory;
public class Aircondition implements Product {
public Aircondition(){
System.out.println("空调被生产了");
}
}
产品被实现后,我们需要创建一个工厂,直接让用户在工厂中取走产品,而不是让用户来创建,从而降低用户和产品的耦合度。
package com.gqx.SimpleFactory;
public class SimpleFactory {
public static Product getProduct(String name){
if (name.equals("wash")) {
return new Wash();
}else if (name.equals("TV")) {
return new TV();
}else if (name.equals("Aircondition")) {
return new Aircondition();
}else {
return null;
}
}
}
客户端
package com.gqx.SimpleFactory;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Product product =SimpleFactory.getProduct("wash");
Product product2 =SimpleFactory.getProduct("TV");
Product product3=SimpleFactory.getProduct("Aircondition");
}
}
简单工厂模式的核心就是SimpleFactory类,他拥有常见产品的权限,我们只需要把订单给它,他就可以生产出相应的产品。但这样也有很多局限,每当我们增加一个产品的时候,都必须修改其源代码,其次,我们有很多产品的时候,里面的if和else关系太过复杂和冗长。
二、工厂方式(Factory Method)
工厂方法模式使用实现抽象工厂角色的多个接口来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!
首先创建产品接口
package com.gqx.Factory;
public interface Product {
}
创建相对应的产品
package com.gqx.Factory;
public class TV implements Product {
public TV(){
System.out.println("电视机被生产了!");
}
} package com.gqx.Factory;
public class Wash implements Product {
public Wash(){
System.out.println("洗衣机被生产了!");
}
} package com.gqx.Factory;
public class Aircondition implements Product {
public Aircondition(){
System.out.println("空调被生产了");
}
}
创建工厂接口、分担简单工厂中‘上帝’的责任
package com.gqx.Factory;
public interface Factory {
}
创建相对应的工厂
package com.gqx.Factory;
public class WashFactory implements Factory {
public Product create(){
return new Wash();
}
} package com.gqx.Factory;
public class TVFactory implements Factory {
public Product createTV(){
return new TV();
}
} package com.gqx.Factory;
public class AirconditionFactory implements Factory {
public Product createAircondition(){
return new Aircondition();
}
}
客户通过指定的工厂拿到指定的产品
package com.gqx.Factory;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
TVFactory tvFactory=new TVFactory();
tvFactory.createTV();
AirconditionFactory airconditionFactory=new AirconditionFactory();
airconditionFactory.createAircondition();
WashFactory washFactory=new WashFactory();
washFactory.create();
}
}
工厂方法虽然解决了上面的问题,但是产品对象增多的时候,会出现大量与之对应的工厂类,这就让我们更加不易理清其中的逻辑了。
三、抽象工厂(Factory Method)
随着客户的要求越来越高,由于不同工厂的产品品质和功能不一样,客户希望生产好的电视机的厂商可以生产洗衣机。于是这个工厂开始生产电视机车和需要的洗衣机。
首先,我们就需要先创建洗衣机和电视机的接口
package com.gqx.AbstractFactory;
public interface Wash {
} package com.gqx.AbstractFactory;
public interface TV {
}
然后两个不同的厂商分别实现其接口
package com.gqx.AbstractFactory;
//厂商一
public class TV1 implements TV {
public TV1 (){
System.out.println("TV1被生产了。哈哈");
}
}
package com.gqx.AbstractFactory;
//厂商一
public class Wash1 implements Wash {
public Wash1(){
System.out.println("Wash1被生产了!");
}
} package com.gqx.AbstractFactory;
//厂商二
public class TV2 implements TV {
public TV2(){
System.out.println("TV2被生产了,哈哈哈");
}
}
package com.gqx.AbstractFactory;
//厂商二
public class Wash2 implements Wash {
public Wash2(){
System.out.println("wash2被生产了,哈哈哈");
}
}
现在开始创建工厂接口
package com.gqx.AbstractFactory;
public interface Factory {
public Wash createWash();
public TV createTv();
}
让两家工厂去实现该接口
package com.gqx.AbstractFactory;
public class Factory1 implements Factory {
@Override
public Wash createWash() {
// TODO Auto-generated method stub
return new Wash1();
} @Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV1();
}
} package com.gqx.AbstractFactory;
public class Factory2 implements Factory {
@Override
public Wash createWash() {
// TODO Auto-generated method stub
return new Wash2();
} @Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV2();
}
}
最后,则是客户端
package com.gqx.AbstractFactory;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory1 factory1=new Factory1();
factory1.createTv();
Factory1 factory11=new Factory1();
factory11.createWash();
}
}

Java-工厂设计模式的更多相关文章
- Java工厂设计模式
程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类 //=============================================== ...
- java工厂设计模式初步
没有利用反射机制定义的简单工厂类 interface Fruit{ public void eat(); } class Apple implements Fruit{ public void eat ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
- java简单工厂设计模式
一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...
- Java设计模式—工厂设计模式
工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person(); //耦合性强 Man p = new Per ...
- Java反射机制(五):使用反射增强简单工厂设计模式
关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍: 我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...
- 工厂设计模式灵魂拷问-Java实现
show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式 ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
随机推荐
- WPF 得一些问题汇总
1.CallMethodAction <TextBox Height="30" Name="txtUserName" Width="160&qu ...
- 重构技巧 引入Null对象
描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空.重构后通过一个空导师类来处理导师为空的相应逻辑. Before # introduce ...
- Activity的跳转与传值(转载)
Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据. Intent是Android一个很重要的类.Intent直译是“意图”,什么是意图呢?比如你想从这个 ...
- ARM中的PC和AXD的PC
R15 (PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令.一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC 总是指向第三条指令 ...
- 【转】成为Java顶尖程序员 ,看这11本书就够了
成为Java顶尖程序员 ,看这11本书就够了 转自:http://developer.51cto.com/art/201512/503095.htm 以下是我推荐给Java开发者们的一些值得一看的好书 ...
- Docker的安装及简单使用
1. Docker的安装 (这里的“安装docker”其实就是安装Docker Engine) $ sudo apt-get intasll docker.io note: apt-get是ubun ...
- 蓝牙音箱bose soundlink mini2链接mac后itunes自动启动的问题解决
1.在应用程序列表中复制一个应用重命名为DoNothingApp.app(非系统应用才可以成功复制) 2.打开terminal执行该命令(执行后需要输入密码),注意mv和iTunes.app后分别有一 ...
- python is == 的区别
要点: is 判断是否是同一个对象.是通过id来判断的 == 是通过值来判断的 为了提高内存利用率对一些简单的对象,如一些数值较小的int对象,python采用重用对象内存的方法 例如指向 ...
- Essential Sublime Text Plugins
Essential Sublime Text Plugins Add some killer tools to your arsenal. View them all at /repo/sublime ...
- 时区 : America/Mexico_City 中文:美国中部时间(墨西哥城) 的夏令时
方法: (参数为: TimeZone timeZone = TimeZone.getTimeZone("America/Mexico_City"); private static ...