【设计模式-工厂相关模式】
工厂相关模式有两种,分别是:
(1)工厂方法模式
(2)抽象工厂模式
接下来分别说下这两种工厂模式:
一、工厂方法模式
(1)定义:
定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
其实就是专职专产,比如某条产品线就只生产一种产品。
(2)实例:
比如车辆厂商有保时捷、法拉利等,他们的厂就专门生产一种品牌的车,这是就会有两个抽象的对象,一个是车,一个是厂,什么厂就生产什么样的车。
车对象:
1、车的抽象对象
public abstract class Car {
public abstract void produce();
}
2、法拉利
public class FerrariCar extends Car {
@Override
public void produce() {
System.out.println("生产一台法拉利");
}
}
3、保时捷
public class PorscheCar extends Car {
@Override
public void produce() {
System.out.println("生产一台保时捷");
}
}
厂对象:
1、厂的抽象对象
public abstract class CarFactory {
public abstract Car getCar();
}
2、法拉利厂--专产法拉利车
public class FerrariFactory extends CarFactory {
@Override
public Car getCar() {
return new FerrariCar();
}
}
3、保时捷厂--专产保时捷车
public class PorscheFactory extends CarFactory {
@Override
public Car getCar() {
return new PorscheCar();
}
}
测试类:
public class Main {
public static void main(String[] args) {
CarFactory carFactory = new FerrariFactory();
Car car = carFactory.getCar();
car.produce();
}
}
测试结果:
它们之间的类图如下:
如果想要在生产其他车,只需要分别创建一个车的子类和厂的子类即可,扩展性较强。
(3)源码实例
在jdk的sun.rmi.runtime包下的LogFactory和Log
二、抽象模式
(1)定义:
提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类。
其实就是一个生态,比如小米生态,小米工厂里面可以生产一系列产品,手机、路由器等。
(2)实例:
比如家用电器厂商有美的、格力等,他们都可以生产电视,洗衣机等家用电器。这里就有两个对象,一个是厂商,一个是家用电器。
家用电器:
1、家用电器抽象类
public abstract class HouseHold {
void produce(){};
}
2、电视类
public class Television extends HouseHold{
@Override
public void produce(){
System.out.println("获取一台电视");
}
}
3、洗衣机
public class Washer extends HouseHold{
@Override
public void produce(){
System.out.println("获取一台洗衣机");
}
}
厂商:
1、抽象厂商--可以获取电视、洗衣机
public interface HouseholdFactory {
/**
* 获取电视
*/
Television getTelevision();
/**
* 获取洗衣机
*/
Washer getWasher();
}
2、美的厂商
public class MediaFactory implements HouseholdFactory {
@Override
public Television getTelevision() {
return new Television();
}
@Override
public Washer getWasher() {
return new Washer();
}
}
3、格力厂商
public class GreeFactory implements HouseholdFactory {
@Override
public Television getTelevision() {
return null;
}
@Override
public Washer getWasher() {
return null;
}
}
测试类:需要获取美的的电视和冰箱
public static void main(String[] args) {
HouseholdFactory householdFactory = new MediaFactory();
Television television = householdFactory.getTelevision();
Washer washer = householdFactory.getWasher();
television.produce();
washer.produce();
}
结果:
这几个类的类图如下:
(3)源码实例:类似与一个接口中可以返回不同的类。
比如Mybatis的SqlSession中可以返回Configuration,也可以返回Connection。
为啥一起记它俩这个模式呢,因为它俩很容易被区分,它俩最大的区别在于是产品等级和产品族的问题。例如法拉利的车和保时捷的车属于同一个产品等级,而冰箱、电视等家用产品是属于同一个产品族,小米的生态圈就可以看做是一个产品族。
工厂方法模式注重的点在产品等级,而抽象工厂注重的点是在产品族。
- 在idea中maven项目jdk编译version总是跳到1.5
- 命令行打印文件树列表: tree
- JavaScript 获取鼠标及元素在页面上的位置
- Spring cache简单使用guava cache
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
- Java8学习(3)- Lambda 表达式
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- java中byte, iso-8859-1, UTF-8,乱码的根源
- 如何启动一个本地静态服务器
- Hello ReactJS
- git合并历史提交
- 常用连续型分布介绍及R语言实现
- banner自动生成工具,ascii文字展示
- 快速排序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法