简单工厂模式(由专门的类来创建实例)

来源:互联网 发布:js删除节点本身 编辑:程序博客网 时间:2024/06/13 23:09

最近入手程杰大牛的《大话设计模式》这本书,这本书深入浅出讲述了面向对象的23种设计模式,语言通俗易懂,代码短小精炼,理论的概述很少,内容都转化成了我们耳熟能详,喜闻乐见的文字,下面让我举个例子哈!
比如我们都学过面向对象编程,但是你要是说起来面向对象有什么好处?恐怕很多人都会懵逼,不知道从何说起。众所周知,四大发明中只有印刷术不是发明而是一种改进,以前的是雕版印刷术(将所有字印在同一个板上)改进成活字印刷术(每个字都是一个印章,需要什么字就去拿章),大家可以想想改进之前有哪些劣势?

  1. 不可维护(假如我印好了一版《滕王阁序》,但是我检查的时候发现,MD,我把“落霞与孤鹜齐飞”中的“齐”印成了“起”,那我这篇文章就废了,还得重新一个一个字印成一版)
  2. 不可重用(即使我印好了也就是只能用这一次,用完就扔了)
  3. 不可扩展(在1中,假如我少印了一个“齐”,那么我还是得重新印)
  4. 总而言之,改进之前很不灵活
    由此我们可见,活字印刷术之前的印刷工们每天大量重复无用的劳动,浪费了很多时间,如果我们的代码中不考虑面向对象思想,那么我们就和这些印刷工们一样了。面向对象就像是活字印刷,一个字一个章,章可以重复利用,章与章之间不会相互影响,需要新字加新章,字错了就改这一个章。
    作者用这个活字印刷的例子帮我深入了解了面向对象思维,不知道有没有帮助你理解呢?如果你很喜欢作者这种比喻的话,在这里隆重推荐这本书哦。

本节课我们要学习的是简单工厂模式

假如我们现在遇到这样一个项目需求:

A公司有两条产品线,一个是生产随身听,一个是生产电视,B公司是采购公司,不懂A公司的产品具体怎么生产,让你根据这一点实现B公司采购的代码

如果不用工厂模式,我们会想,不就是定义一个随身听类,一个电视类吗,然后定义一个采购类,采购随身听或者电视类?这个思路是错的,因为你在采购类采购随身听或者电视类就相当于知道了mp3和tv是如何制造的(你调用了他们的构造方法)这和题目要求不符。

???该怎么做呢?

现在是两条产品线,以后会不会增加更多呢?考虑到可扩展性,我们需要定义一个产品线类(Product),包括随身听类(MP3)和电视类(TV),以后也许会有空调类,冰箱类等等,A还需要有一个工厂类,因为B不知道我怎么生产的,我得根据B的需求提供相应的产品(也就是从A工厂拿货物)Factory类,对于B来说,B只负责采购,需要一个采购的类,下面我们看代码:

 代码1 产品 public interface Product {     void play();//具备播放功能}
public class MP3 implements Product {    @Override    public void play() {        System.out.print("mp3播放音乐!");    }}
public class TV implements Product {    @Override    public void play() {        System.out.print("TV播放电视剧!");    }}
采购工厂,B只需要提出需求,A工厂来负责生产对应的产品public class Factory {    public static  Product getProduct(String s){        switch (s){            case "TV":                TV tv = new TV();                return tv;            case "mp3":                MP3 mp3 = new MP3();                return mp3;            default:                return null;        }    }}
B提出了需求要生产TV,工厂就去生产TVpublic class Main {    public static void main(String args[])    {        TV tv = (TV) Factory.getProduct("TV");    }}

简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程
具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
我们日常工作中最经常用的简单工厂模式就是JDBC使用
这里写图片描述

1 0
原创粉丝点击