工厂用来生产对象,对象具有方法和属性。

简单工厂的缺点(简单工厂并不是23中设计模式):

工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则;

JDK源码中使用的简单工厂类:

Calendar;

改进方法:能够直接通过反射去改进简单工厂的开闭原则(对扩展开放,对修改关闭);

工厂方法

定义一个创建对象的接口,但让实现这个接口的类,来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

适用场景:

1):创建对象需要大量的重复代码

2):客户端不依赖于产品类实力如何被创建,实现等细节。

3):一个类通过子类来制定创建哪一个对象

工厂方法-优点:

用户只需要关心产品对应的工厂无需关心创建细节。

加入新产品符合开闭原则,提高可扩展性

工厂方法-缺点:

类的个数容易过多,增加复杂度。

增加了系统的抽象性和理解难度。

public abstract class Video {
public abstract void produce(); }
public abstract class VideoFactory {

    public abstract Video getVideo();

//    public Video getVideo(Class c){
// Video video = null;
// try {
// video = (Video) Class.forName(c.getName()).newInstance();
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// }
// return video;
// }
//
//
// public Video getVideo(String type){
// if("java".equalsIgnoreCase(type)){
// return new JavaVideo();
// }else if("python".equalsIgnoreCase(type)){
// return new PythonVideo();
// }
// return null;
// } }
public class PythonVideoFactory extends VideoFactory {
@Override
public Video getVideo()
{
return new PythonVideo();
}
}
public class PythonVideo extends Video {
@Override
public void produce()
{
System.out.println("录制Python课程视频");
}
}
public class JavaVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
}
public class JavaVideo extends Video {
@Override
public void produce()
{
System.out.println("录制Java课程视频");
}
}
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new PythonVideoFactory();
VideoFactory videoFactory2 = new JavaVideoFactory();
VideoFactory videoFactory3 = new FEVideoFactory();
Video video = videoFactory.getVideo();
video.produce();
} }

抽象工厂模式:

抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口。

无需指定具体的类

适用场景:

客户端不依赖于产品类实例如何被创建实现等细节。

强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码。

提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现。

抽象工厂-优点:

具体产品在应用层代码隔离,无需关心创建细节。

将一个一系列产品族统一到一起创建。

抽象工厂-缺点:

1.规定了所有可能被创建的产品集合,产品族中扩展新的产品比较困难,需要修改新的抽象接口

2.增加了系统的抽象度和理解难度。

总结:

抽象工厂平时开发产品的时候要去找产品等级相对固定的。

抽象工厂模式对应的是产品族。

工厂方法模式对应的是产品等级结构。

public interface CourseFactory {
Video getVideo();
Article getArticle(); }
public abstract class Article {
public abstract void produce();
}
public abstract class Video {
public abstract void produce(); }
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo()
{
return new JavaVideo();
} @Override
public Article getArticle() {
return new JavaArticle();
}
}
public class JavaArticle extends Article {
@Override
public void produce()
{
System.out.println("编写Java课程手记");
}
}
public class JavaArticle extends Article {
@Override
public void produce()
{
System.out.println("编写Java课程手记");
}
}
public class PythonCourseFactory implements CourseFactory {
@Override
public Video getVideo()
{
return new PythonVideo();
} @Override
public Article getArticle() {
return new PythonArticle();
}
}
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python课程视频");
}
}
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("编写Python课程手记");
}
}

01.DesignParttern设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系的更多相关文章

  1. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html   v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...

  2. 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂

    三种工厂模式的详解: 简单工厂模式: 适用场景:工厂类负责创建的对象较少,客户端只关心传入工厂类的参数,对于如何创建对象的逻辑不关心 缺点:如果要新加产品,就需要修改工厂类的判断逻辑,违背软件设计中的 ...

  3. 设计模式--简单工厂VS工厂VS抽象工厂

    前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...

  4. Head First设计模式——简单工厂、工厂、抽象工厂

    前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习.并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同. 话说Head First认为简单工厂并不是设计模式,而是 ...

  5. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  6. C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

    一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...

  7. iOS设计模式解析(二)抽象工厂方法

    抽象工厂方法:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 与工厂方法区别: 抽象工厂通过对象组合创建抽象产品.工厂通过类集成创建抽象产品 抽象工厂创建多系列产品.工厂创建一种产 ...

  8. 设计模式之工厂模式VS抽象工厂

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

  9. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

随机推荐

  1. redis使用技巧小结

    一.Redis 密码设置和查看密码redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证.1.初始化Redis密码:在配置文件中有个参数:re ...

  2. 「AT4741 [ABC132D] Blue and Red Balls」

    题目大意 给出一个长度为 \(N\) 的01串,其中有 \(K\) 个 \(1\),其他都是 \(0\),需要求出当着 \(K\) 个 \(1\) 分成 \(1\) 到 \(K\) 段每一个的方案数. ...

  3. [ DLPytorch ] 注意力机制&机器翻译

    MachineTranslation 实现过程 rstrip():删除 string 字符串末尾的指定字符(默认为空格). 语法:str.rstrip([chars]) 参数:chars -- 指定删 ...

  4. Solidity基本数据结构

    任何一个智能合约都会在最开头表示使用的编译器版本 如:prama solidity ^0.4.0 数组: //静态数组 大小长度确定 uint[2] fixedArray; //动态数组,可以随意添加 ...

  5. Linux - kali Linux重置密码

    1. recovery mode -> E 2. ro -> rw 3. plus init=/bin/bash 4. passwd root

  6. [蓝桥杯2016初赛]卡片换位 BFS

    题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...

  7. log4j 日志配置

    参考:https://blog.csdn.net/x6582026/article/details/52179817/ 1.引入jar包 log4j-1.2.17.jar log4j-core-2.1 ...

  8. 前端代码编译器Hbuilder下载地址和谷歌浏览器下载地址

    编译器:HbuilderX 浏览器:谷歌浏览器

  9. 8个问题全面了解5G关键技术Massive MIMO

    1 什么是Massive MIMO Massive MIMO(大规模天线技术,亦称为Large Scale MIMO)是第五代移动通信(5G)中提高系统容量和频谱利用率的关键技术.它最早由美国贝尔实验 ...

  10. CPD

    CPD,Cost per day的缩写,意思是按天收费,是一种广告合作方式.在实际的广告合作中根据行业不同还包括Cost per Download的缩写含义,意思是依据实际下载量收费.