工厂模式

1.首先,抽象出来工厂生产出来的产品模板接口:

package com.gupaoedu.vip.factory;

//产品接口

//汽车需要满足一定的标准

public interface Car {

//规定汽车的品牌

String getName();

}

2.定义工厂中可以生产的实体:

package com.gupaoedu.vip.factory;

public class Audi implements Car{

@Override

public String getName() {

return "Audi";

}

}

package com.gupaoedu.vip.factory;

public class Benz implements Car{

@Override

public String getName() {

return "Benz";

}

}

package com.gupaoedu.vip.factory;

public class Bmw implements Car{

@Override

public String getName() {

return "BMW";

}

}

3.定义一个工厂,该工厂根据你想要的实体名称,生产出不同的实体:

package com.gupaoedu.vip.factory.simple;

import com.gupaoedu.vip.factory.Audi;

import com.gupaoedu.vip.factory.Benz;

import com.gupaoedu.vip.factory.Bmw;

import com.gupaoedu.vip.factory.Car;

//对于这个工厂来说(太强大了)

//为什么?

//这个工厂啥都能干(不符合现实)

//编码也是一种艺术(融汇贯通),艺术来源于生活,回归到生活的

public class SimpleFactory {

//实现统一管理、专业化管理

//如果没有工厂模式,小作坊,没有执行标准的

//如果买到三无产品(没有标准)

//卫生监督局工作难度会大大减轻

//中国制造(按人家的标准执行)

//中国制造向中国创造改变(技术不是问题了,问题是什么?思维能力)

//码农就是执行标准的人

//系统架构师,就是制定标准的人

//不只做一个技术者,更要做一个思考者

public Car getCar(String name){

if("BMW".equalsIgnoreCase(name)){

//Spring中的工厂模式

//Bean

//BeanFactory(生成Bean)

//单例的Bean

//被代理过的Bean

//最原始的Bean(原型)

//List类型的Bean

//作用域不同的Bean

//getBean

//非常的紊乱,维护困难

//解耦(松耦合开发)

return new Bmw();

}else if("Benz".equalsIgnoreCase(name)){

return new Benz();

}else if("Audi".equalsIgnoreCase(name)){

return new Audi();

}else{

System.out.println("这个产品产不出来");

return null;

}

}

}

4.测试类:

package com.gupaoedu.vip.factory.simple;

import com.gupaoedu.vip.factory.Car;

public class SimpleFactoryTest {

public static void main(String[] args) {

//这边就是我们的消费者

Car car = new SimpleFactory().getCar("Audi");

System.out.println(car.getName());

}

}

缺点:当生产的实体很多时,需要写大量的if-else。

改进:

当实体类过多时,就不能一个工厂生产全部实体了,那就多建几个工厂,分别生产不同的产品,比如:面粉在面粉厂中生产,水杯在水杯厂中生产。

1.定义工厂的接口

package com.gupaoedu.vip.factory.func;

import com.gupaoedu.vip.factory.Car;

//工厂接口,就定义了所有工厂的执行标准

public interface Factory {

//符合汽车上路标准

//尾气排放标准

//电子设备安全系数

//必须配备安全带、安全气囊

//轮胎的耐磨程度

Car getCar();

}


2.建立多个工厂:

package com.gupaoedu.vip.factory.func;

import com.gupaoedu.vip.factory.Audi;

import com.gupaoedu.vip.factory.Car;

public class AudiFactory implements Factory {

@Override

public Car getCar() {

return new Audi();

}

}

package com.gupaoedu.vip.factory.func;

import com.gupaoedu.vip.factory.Benz;

import com.gupaoedu.vip.factory.Car;

public class BenzFactory implements Factory {

@Override

public Car getCar() {

return new Benz();

}

}

package com.gupaoedu.vip.factory.func;

import com.gupaoedu.vip.factory.Bmw;

import com.gupaoedu.vip.factory.Car;

public class BmwFactory implements Factory {

@Override

public Car getCar() {

return new Bmw();

}

}

3.测试类:

package com.gupaoedu.vip.factory.func;

public class FactoryTest {

public static void main(String[] args) {

//工厂方法模式

//各个产品的生产商,都拥有各自的工厂

//生产工艺,生成的高科技程度都是不一样的

Factory factory = new AudiFactory();

System.out.println(factory.getCar());

//需要用户关心,这个产品的生产商

factory = new BmwFactory();

System.out.println(factory.getCar());

//增加的代码的使用复杂度

//抽象工厂模式

}

}

缺点:虽然对工厂进行了细分,但是,用户需要某个实体时,需要建一个对应的工厂,比较麻烦,怎么让用户接触不到工厂,只需要告诉工厂类需要什么,工厂类只管生产就行了?

引用抽象工厂:

1)定义一个抽象工厂,定义一个默认抽象方法protected abstract Car getCar();,只要是工厂,就得实现该方法,宝马工厂,通过重写该方法,生产宝马。不同的工厂通过重写该方法,可以生产出不同的实体,默认工厂也是一样:

package com.gupaoedu.vip.factory.abstr;

import com.gupaoedu.vip.factory.Car;

public abstract class AbstractFactory {

protected abstract Car getCar();

//这段代码就是动态配置的功能

//固定模式的委派

public Car getCar(String name){

if("BMW".equalsIgnoreCase(name)){

return new BmwFactory().getCar();

}else if("Benz".equalsIgnoreCase(name)){

return new BenzFactory().getCar();

}else if("Audi".equalsIgnoreCase(name)){

return new AudiFactory().getCar();

}else{

System.out.println("这个产品产不出来");

return null;

}

}

}

2)定义一个默认工厂方法:

package com.gupaoedu.vip.factory.abstr;

import com.gupaoedu.vip.factory.Car;

public class DefaultFactory extends AbstractFactory {

private AudiFactory defaultFactory = new AudiFactory();

public Car getCar() {

return defaultFactory.getCar();

}

}

3)构建各种工厂:

package com.gupaoedu.vip.factory.abstr;

import com.gupaoedu.vip.factory.Audi;

import com.gupaoedu.vip.factory.Car;

//具体的业务逻辑封装

public class AudiFactory extends AbstractFactory {

@Override

public Car getCar() {

return new Audi();

}

}

package com.gupaoedu.vip.factory.abstr;

import com.gupaoedu.vip.factory.Benz;

import com.gupaoedu.vip.factory.Car;

public class BenzFactory extends AbstractFactory {

@Override

public Car getCar() {

return new Benz();

}

}

package com.gupaoedu.vip.factory.abstr;

import com.gupaoedu.vip.factory.Bmw;

import com.gupaoedu.vip.factory.Car;

public class BmwFactory extends AbstractFactory {

@Override

public Car getCar() {

return new Bmw();

}

}

4)测试类:

package com.gupaoedu.vip.factory.abstr;

public class AbstractFactoryTest {

public static void main(String[] args) {

DefaultFactory factory = new DefaultFactory();

System.out.println(factory.getCar("Benz"));

//设计模式的经典之处,就在于,解决了编写代码的人和调用代码的人双方的痛处

//解放我们的双手

}

}

使用默认工厂进行生产实体,如果不传参数,使用默认工厂生产实体,如果传参数,使用父类抽象工厂生产实体。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 一、简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽...
    墨雨轩夏阅读 479评论 0 3
  • 一、简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽...
    Java架构_师阅读 405评论 0 0
  • 一、简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽...
    JAVA一方阅读 203评论 0 0
  • 什么是工厂模式 工厂模式是一种广泛使用的设计模式,被广泛使用与JDK和一些框架中,比如著名的Spring和Stru...
    jackLee阅读 1,055评论 0 1
  • 工厂模式概述 工厂模式是设计模式的一种,从功能上来说,它的主要作用是创建对象。细分一下,有三种不同类型的工厂模式,...
    flionel阅读 699评论 5 3