java设计模式2————工厂模式

1、工厂模式介绍:

1.1、实现了创建者与调用者的分离

1.2、详细分类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

1.3、所遵循的OOP原则:

  • 开闭原则:对扩展开放,对修改关闭
  • 依赖倒转原则:面向接口编程
  • 迪米特法则:只与你直接的朋友进行通信,而避免与陌生人进行通信。

1.4、核心本质

  • 实例化对象,不使用new,用工厂方法代替
  • 将调用者与我们的实现类解耦

1.5、三种模式

2、简单工厂模式

2.1、先建立汽车抽象类

package com.xgp.company.第二种_工厂模式.简单工厂模式;

public interface Car {
void name();

}

2.2、制造车

制造“五凌”车

package com.xgp.company.第二种_工厂模式.简单工厂模式;

public class WuLing implements Car {

@Override

public void name() {

System.out.println("五凌宏观");

}

}

制造“特斯拉”车

package com.xgp.company.第二种_工厂模式.简单工厂模式;

public class Tesla implements Car {

@Override

public void name() {

System.out.println("特斯拉");

}

}

2.3、创建汽车工厂(两种方式工厂制造对像)

package com.xgp.company.第二种_工厂模式.简单工厂模式;
/**
* 简单工厂模式,又成为静态工厂模式
* 弊端:增加一个新产品时,如果你不修改代码,做不到
*/ /**
  • 汽车工厂

    */

    public class CarFactory {

    public static Car getCar(String car) {

    if("五凌".equals(car)) return new WuLing();

    if("特斯拉".equals(car)) return new Tesla();

    return null;

    } /**
    • 第二种方式
    • @return

      */

      public static Car getWuLing() {

      return new WuLing();

      }
    public static Car getTesla() {

    return new Tesla();

    }

    }

2.4、建立买车类(传统方法创建对象被注释了和通过工厂创建对象)

package com.xgp.company.第二种_工厂模式.简单工厂模式;

/**
  • 买车

    /

    public class Consumer {

    /
    //*
    • 传统的方式
    • @param args

      //

      public static void main(String[] args) {

      //弊端:需要了解接口和所有的实现类

      Car car1 = new WuLing();

      Car car2 = new Tesla(); car1.name();

      car2.name();

      }*/
    /**
    • 简单工厂模式
    • @param args

      */

      public static void main(String[] args) {

      Car car1 = CarFactory.getCar("五凌");

      Car car2 = CarFactory.getCar("特斯拉"); car1.name();

      car2.name();

      }

      }

2.5、缺点:如果要增加一个“大众”的汽车,还需要修改工厂代码

package com.xgp.company.第二种_工厂模式.简单工厂模式;

/**
  • 弊端:增加实现类时需要改工厂类的代码

    */

    public class Dazhong implements Car {

    @Override

    public void name() {

    System.out.println("大众");

    }

    }

2.6、运行结果

五凌宏观
特斯拉

2.7、UML类图

3、工厂方法模式

3.1、建立汽车抽象类

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public interface Car {
void name();

}

3.2、创建车

创建“五凌”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public class WuLing implements Car {

@Override

public void name() {

System.out.println("五凌宏观");

}

}

创建“特斯拉”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public class Tesla implements Car {

@Override

public void name() {

System.out.println("特斯拉");

}

}

3.3、创建汽车工厂的抽象类

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public interface CarFactory {

Car getCar();

}

3.4、创建汽车工厂

创建制造“五凌”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}

}

创建制造“特斯拉”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public class TeslaFactory implements CarFactory {

@Override

public Car getCar() {

return new Tesla();

}

}

3.5、新增一辆“大众”车

新增一辆“大众”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;

/**
  • 弊端:增加实现类时需要改工厂类的代码

    */

    public class Dazhong implements Car {

    @Override

    public void name() {

    System.out.println("大众");

    }

    }

新增一辆“大众”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;

public class DazhongFactory implements CarFactory {

@Override

public Car getCar() {

return new Dazhong();

}

}

3.6、创建消费者类

package com.xgp.company.第二种_工厂模式.工厂方法模式;

/**
  • 买车

    */

    public class Consumer {

    public static void main(String[] args) {

    Car car1 = new WuLingFactory().getCar();

    Car car2 = new TeslaFactory().getCar();

    Car car3 = new DazhongFactory().getCar();
     car1.name();
    car2.name();
    car3.name();

    }

    //根据设计原则:工厂方法模式

    //更据实际业务:简单工厂模式

    }

3.7、弊端:增加实现类时需要改工厂类的代码

总结:

根据设计原则:工厂方法模式

更据实际业务:简单工厂模式

3.8、UML类图

4、小节

5、抽象工厂模式

5.1、该模式介绍

5.2、UML类图设计


5.3、创建生产产品种类的抽象类

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 抽象产品工厂

    */

    public interface IProductFactory {

    //生产手机

    IPhoneProduct iphoneProduct(); //生产路由器

    IRouterProduct routerProduct();

    }

5.4、创建手机和路由器的抽象接口

手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 手机接口

    */

    public interface IPhoneProduct {

    void start(); //开机

    void shutdown(); //关机

    void callup(); //打电话

    void sendSMS(); //发短信

    }

路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 路由器产品接口

    */

    public interface IRouterProduct {

    void start(); //开机

    void shutdown(); //关机

    void openWifi(); //打开网络

    void setting(); //设置参数

    }

5.5、创建小米工厂

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

public class XiaomiFactory implements IProductFactory {

@Override

public IPhoneProduct iphoneProduct() {

return new XiaomiPhone();

}
@Override
public IRouterProduct routerProduct() {
return new XiaomiRouter();
}

}

5.6、小米工厂制造小米手机、小米路由器

制造小米手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 小米手机

    */

    public class XiaomiPhone implements IPhoneProduct {

    @Override

    public void start() {

    System.out.println("开启小米手机");

    } @Override

    public void shutdown() {

    System.out.println("关闭小米手机");

    } @Override

    public void callup() {

    System.out.println("小米打电话");

    } @Override

    public void sendSMS() {

    System.out.println("小米发短信");

    }

    }

制造小米路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 小米路由器

    */

    public class XiaomiRouter implements IRouterProduct {

    @Override

    public void start() {

    System.out.println("开启小米路由器");

    } @Override

    public void shutdown() {

    System.out.println("关闭小米路由器");

    } @Override

    public void openWifi() {

    System.out.println("小米网络");

    } @Override

    public void setting() {

    System.out.println("小米参数");

    }
}

5.7、创建华为工厂

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

public class HuaweiFactory implements IProductFactory {

@Override

public IPhoneProduct iphoneProduct() {

return new HuaweiPhone();

}
@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}

}

5.8、华为工厂制造华为手机、华为路由器

制造华为手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

/**
  • 华为手机

    */

    public class HuaweiPhone implements IPhoneProduct { @Override

    public void start() {

    System.out.println("开启华为手机");

    } @Override

    public void shutdown() {

    System.out.println("关闭华为手机");

    } @Override

    public void callup() {

    System.out.println("华为手机打电话");

    } @Override

    public void sendSMS() {

    System.out.println("华为手机发短信");

    }

    }

制造华为路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

public class HuaweiRouter implements IRouterProduct {

@Override

public void start() {

System.out.println("开启华为路由器");

}
@Override
public void shutdown() {
System.out.println("关闭华为路由器");
} @Override
public void openWifi() {
System.out.println("华为网络");
} @Override
public void setting() {
System.out.println("华为参数");
}

}

5.9、根据工厂制造产品

package com.xgp.company.第二种_工厂模式.抽象工厂模式;

public class Client {

public static void main(String[] args) {

System.out.println("小米系列产品=");

//小米工厂

XiaomiFactory xiaomiFactory = new XiaomiFactory();
    //小米手机
IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct(); iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown(); //小米路由器
IRouterProduct routerProduct = xiaomiFactory.routerProduct(); routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown(); System.out.println("================华为系列产品=================");
//华为工厂
HuaweiFactory huaweiFactory = new HuaweiFactory(); //华为手机
iphoneProduct = huaweiFactory.iphoneProduct(); iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown(); //华为路由器
routerProduct = huaweiFactory.routerProduct(); routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown();
}

}

5.10、运行结果

================小米系列产品=================
开启小米手机
小米打电话
小米发短信
关闭小米手机
开启小米路由器
小米网络
小米参数
关闭小米路由器
================华为系列产品=================
开启华为手机
华为手机打电话
华为手机发短信
关闭华为手机
开启华为路由器
华为网络
华为参数
关闭华为路由器 进程完成,退出码 0

5.11、实际的UML类图

分析:

java设计模式2————工厂模式的更多相关文章

  1. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  2. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  3. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  4. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  5. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  6. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  7. Java设计模式之-----工厂模式(简单工厂,抽象工厂)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  8. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  9. java设计模式之一工厂模式

    简单工厂模式是java设计模式中最简单的设计模式之一: 工厂模式是最常用的设计模式之一. 工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模 ...

随机推荐

  1. 洛谷$P5329\ [SNOI2019]$字符串 字符串

    正解:字符串 解题报告: 传送门$QwQ$ 有两个很妙的方法,分别港下$QwQ$ 首先为了表示方便,这里和题面一样设$s_i$表示去掉第$i$个字母得到的字符串.另设$lcp(i,j)$表示$suf_ ...

  2. HDU4352 XHXJ's LIS 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasin ...

  3. Spring Data JPA使用findAllOrderBy时踩的坑

    Spring Data JPA使用findAllOrderBy时踩的坑 按照以往的编程经验,我的写法是这样的: List<ActivityEntity> findAllOrderByWis ...

  4. Vim区块选择

    区块选择的按键意义: 区块选择的按键意义 v 字符选择,光标经过的地方反白 V 列选择,光标经过的列反白 [ctrl]+v 区块选择,可以用长方形的方式选择资料 d 将发白的地方删除掉 y 将反白的地 ...

  5. 重新认识C语言的指针(上)

    ​ 独创性并不是首次观察某种新事物,而是把旧的.很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 -尼采 本文已经收录至我的GitHub,欢迎大家踊跃star 和 i ...

  6. MySQL故障演习

    MySQL故障演习 接上次的 MySQL定时备份 该次实验主要是练习在MySQL数据库发生误删等意外情况下,利用全量备份文件和增量备份文件恢复数据. 1. 实验环境 -- 创建数据库 create d ...

  7. MapGIS文件如何压缩存盘

    经过多次编辑修改的MapGIS数据,含有大量逻辑上已删除的节点或图元,数据冗余复杂, 在转换过程前应注意一定要采用压缩存盘方式处理,目的是确保编辑状态已删除的数据真正从物理存储层删除,以确保数据的精简 ...

  8. 奇葩的Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    启动springboot的时候莫名其妙出现这个错误,我properties里面也没配置数据源啥的,但就是出现这个错误 解决方法: 在启动类上加@SpringBootApplication(exclud ...

  9. Java Linked集合的简单介绍和常用方法的使用

    LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...

  10. 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?

    晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...