工厂设计模式

1.什么是工厂设计模式,为什么需要工厂设计模式

工厂设计模式:需要一个东西,你不需要自己去手动制造,而是交给工厂去制造,你去工厂里面取你所需要的东西。比如:需要用到一个对象,你不需要手动去new,而是去工厂中获取,有工厂来创建这个对象。

好处:解耦,减少冗余,提高容错

解耦:假如一个A类需要B类,A类只需要关注你所调用的方法,至于B类的创建A类不需要关心,只需要去从工厂中获取即可

减少冗余:假如一个类的创建特别复杂,每次使用都要自己创建一遍,会产生大量的冗余代码,工厂提供了统一的创建对象的方法,从一定程度上减少了冗余代码

提高容错性:如果自己需要一个类自己每次都要手动创建,有可能某一次创建代码会出现问题,工厂规避了这个问题

简单工厂(静态工厂)

/**
* 产品牛奶 接口定义
*/
public interface IMilk{
     void product();
}
public class JinDianMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is Jing Dian milk");    
    }
}
public class MengNiuMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is meng niu milk");
    }
}
public class TelunSuMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is tls milk");
    }
}
public class SimpleFactory{
  public static finalintJD =1;
  public static finalintMN =2;
  public static finalintTLS =3;
  public static IMilk creatMilk(int i){
      switch(i){
          case1:returnnewJinDianMilk();
          case2:returnnewMengNiuMilk();
          case3:returnnewTelunSuMilk();
          default:System.out.println("no such milk");
        }
      return null;
    }
}
/**
*  简单工厂设计模式
*  可以是实现工厂的要求 一个工厂可以生产出不同产品来
*  但是 这种方式耦合性高  假如需要再加一种产品  需要修改代码逻辑
*  违背了 开闭原则
*  耦合度高 扩展性差
*/
public class SimpleFactoryMain{
    public static void main(String[] args){
        IMilk jdMilk = SimpleFactory.creatMilk(SimpleFactory.JD);
        jdMilk.product();
        IMilk mnMilk = SimpleFactory.creatMilk(SimpleFactory.MN);
        mnMilk.product();
    }
}

工厂方法模式

/**
* 产品牛奶 接口定义
*/
public interface IMilk{
  void product();
}
/**
* 工厂接口
*/
public interface IFactory{
  IMilk create();
}
/**
* 产品类 -- 经典
*/
public class JinDianMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is Jing Dian milk");
    }
}
/**
* 生产经典牛奶的工厂
*/
public class JinDianFactory implements IFactory{
    @Override
    public IMilk create(){
        return new JinDianMilk();
    }
}
/**
* 产品类(蒙牛)
*/
public class MengNiuMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is meng niu milk");
    }
}
/**
* 生产蒙牛的工厂
*/
public class MengNiuFactory implements IFactory{
  @Override
  public IMilk create(){
    return new MengNiuMilk();
    }
}
/**
* 产品类 -- 特仑苏
*/
public class TelunSuMilk implements IMilk{
  @Override
  public void product(){
        System.out.println("this is tls milk");
    }
}
/**
* 生产特仑苏的工厂
*/
public class TelunSuFactory implements IFactory{
  @Override
  public IMilk create(){
    return new TelunSuMilk();
    }
}
/**
* 工厂方法模式
* 这个种模式 工厂做到了抽象化 每加一种产品
* 可以动态的扩展工厂 不需要修改之前的业务逻辑代码
* 相比简单工厂模式 代码变得灵活了 符合了开闭原则
* <p>
* 缺点: 这种方式 随着产品种类的增加  会出现大量
* 与之对应的工厂对象 工程会显得很臃肿
*/
public class FactoryMethod{
  public static void main(String[] args){
        IFactory jinDianFactory =newJinDianFactory();
        IFactory mengNiuFactory =newMengNiuFactory();
        IFactory telunSuFactory =newTelunSuFactory();
        IMilk iMilk = jinDianFactory.create();
        iMilk.product();
        IMilk iMilk1 = mengNiuFactory.create();
        iMilk1.product();
        IMilk iMilk2 = telunSuFactory.create();
        iMilk2.product();
    }
}

抽象工厂

/**
* 产品牛奶 接口定义
*/
public interface IMilk{
 void product();
}
/**
* 抽象工厂
*/
public abstract class IFactory{     
    abstract IMilk createJDMilk();
    abstract IMilk createMnMilk();
    abstract IMilk createTlsMilk();
}
/**
* 经典牛奶  产品类
*/
public class JinDianMilk implements IMilk{
  @Override
  public void product(){
        System.out.println("this is Jing Dian milk");
    }
}
/**
* 蒙牛 产品类
*/
public class MengNiuMilk implements IMilk{
    @Override
    public void product(){
        System.out.println("this is meng niu milk");
    }
}
/**
*  特仑苏  产品类
*/
public class TelunSuMilk implements IMilk{
  @Override
  public void product(){
        System.out.println("this is tls milk");
    }
}
/**
* 工厂的实现
*/
public class Factory extends IFactory{
  @Override
  IMilk createJDMilk(){
    return new JinDianMilk();
  }
  @Override
  IMilk createMnMilk(){
    return new MengNiuMilk();
 }
@Override
IMilk createTlsMilk(){
  return new TelunSuMilk();
    }
}
/**
*  抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,
*  在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中,
*  例如在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,
*  它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。
*  抽象工厂模式也是在软件开发中最常用的设计模式之一。
*
*  1. 主要优点
*  (1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,
*  更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,
*  因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
*  (2) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
*  (3) 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
*  2. 主要缺点
*  抽象工厂模式的主要缺点如下:
*  增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,
*  违背了“开闭原则”。
*  适用场景摘录:
*  (1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,
*      这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
*  (2) 系统中有多于一个的产品族,而每次只使用其中某一产品族。
*      可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
*  (3) 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
*      同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,
*      如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,
*      此时具有一个共同的约束条件:操作系统的类型。
*  (4) 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
*
*
*/
public class AbstractFactoryMain{
  public static void main(String[] args){
        Factory factory =newFactory();
        IMilk jdMilk = factory.createJDMilk();
        jdMilk.product();
        IMilk mnMilk = factory.createMnMilk(); 
        mnMilk.product();
        IMilk tlsMilk = factory.createTlsMilk();
        tlsMilk.product();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 工厂设计模式(1)—普通的工厂模式工厂设计模式(2)—枚举实现工厂模式 序: 为什么需要工厂模式? 学习工厂模式之...
    小胖学编程阅读 1,210评论 0 3
  • 什么是工厂设计模式? 将工厂提取成一个接口或抽象类,具体生产什么产品由子类决定,工厂设计模式是将拥有共性的产品抽象...
    Spring618阅读 251评论 0 0
  • 今天下午第一节课是品德课。 品德老师每次都会用一点时间来上课,其余的时间给我们做作业,我们每次做的都是...
    雨雨语阅读 324评论 0 2
  • 对于学习,对于办事 怎么样才是学会,反复了好几遍,而不是干斋片言只语,整体结构 怎么样才是办好,大胆积极联络,
    Zgmdada阅读 103评论 0 0
  • 动物世界,顾名思义,动物的世界,其特点——野蛮,冷血。这部电影,冲击最大的,概括起来,两个字——兽性。人...
    凌晟阅读 566评论 0 1