设计模式(三)简单工厂模式

写在前面

            说起来惭愧,设计模式系列本来早就想写了,也参考了很多书籍和博客,但是始终没有下手,冷风中瑟瑟发抖,看前面就知道,转载了俩篇,想糊弄一下,嘻嘻,但是这俩天突然受到了刺激(当然是跟超级大佬在一起讨论被叼了)所以从这章节起,我要开始认真了(划水),也希望各位看官们多提点意见,多多支持(超级大佬轻拍,略略略)。

            快乐的我又回来了,拖了几天时间,主要是最近太忙了(呜呜。。。),废话不多说,首先来看一下百度百科对简单工厂模式的解释:

             简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

(1)UML图:
           

工厂类:简单工厂模式的核心,负责生产具体的产品,实现具体的内部逻辑。

具体产品类:具体的产品,由工厂类生产出来。

抽象产品类:所有具体产品的父类。负责描述所有产品的公共接口

(2)简单例子:

我们就以一个生产玩具的工厂来作为列子吧!

玩具分为俩种玩具:电动玩具和非电动玩具,那么首先我们就要有个父类来描述玩具这个抽象的事物:

public abstract class WanJu{
/**
*抽象的产品类,负责描述抽象的产品,是具体产品类的父类
**/
public abstract void toys();

}

然后是具体的产品类:电动产品和非电动产品去继承抽象产品这个父类

public  class DianDong extend WanJu{
@Overried
public void toys(){
System.out.println("我是电动玩具!")
}
} 
public  class FeiDianDong extend WanJu{
@Overried
public void toys(){
System.out.println("我是非电动玩具!")
}
} 

好了,我们定义好了具体的产品和他们的抽象父类了,该到核心类了——那么,这些玩具要由工厂去生产吧,那么,我们定义一个工厂类去生产这些具体的玩具!

public class ToysFactory {
    public static Toys createToys (String type){
        Toys toys =null;
        switch (type) {
            case "dianDong":
                toys =new DianDOng();
               break;
            case "feiDianDong":
                toys =new FeiDianDong();
                break;

        }
        return toys ;
    }
}

工厂类是负责生产具体的产品,你只要输入你想生产的具体产品的类型就可以了。

测试:

public class CreatToys {
    public static void main(String[]args){
      ToysFactory.createToys("dianDong").toys;
    }
}

如果我们还要想增加其他的具体玩具,就去实现抽象玩具类,然后自己完成自己的部分就行了,工厂类再添加一条生产其他玩具的判断就ok了!

使用场景:

  • 工厂类创建的对象比较少;

  • 消费者只需要传进工厂类的参数,对于如何创建对象不关心;

简单工厂模式的优点

  • 首先程序实现了解耦和,大大降低的程序之间的耦合

  • 提高了程序的扩展性

简单工厂模式的缺点:

        可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。​​​​​​​

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值