简单工厂模式

简单工厂模式

简单工厂模式又叫静态工厂方法(Static Factory Method)模式。简单工厂模式主要是解决对象的创建问题,被创建的类通常都有相同的父类。

在家的时候爸爸妈妈都喜欢看电视,爸爸关注新闻频道,妈妈要看时装频道。写成代码就是如下形式:

  • 新闻频道类
public class News {
    public void watch() {
        System.out.print("watch news");
    }
}
  • 时装频道类
public class Fashion {
    public void watch() {
        System.out.print("watch fashion");
    }
}
  • 客户端测试类
public class Client {
    public static void main(String[] args) {
        String person = "father";
        switch (person) {
            case "father" :
                News news = new News();
                news.watch();
                break;
            case "mather" :
                Fashion fashion = new Fashion();
                fashion.watch();
                break;
        }
    }
}

放学后,儿子回来了,儿子最爱看卡通片了。进行如下修改:

  • 卡通频道类
public class Cartoon {
    public void watch() {
        System.out.print("watch cartoon");
    }
}

加了卡通频道这个类后发现还不行,还要让客户端知道儿子要看卡通片,于是再进行修改:

  • 客户端测试类
public class Client {
    public static void main(String[] args) {
        String person = "father";
        switch (person) {
            case "father" :
                News news = new News();
                news.watch();
                break;
            case "mather" :
                Fashion fashion = new Fashion();
                fashion.watch();
                break;
            case "child" :
                Cartoon cartoon = new Cartoon();
                cartoon.watch();
                break;
        }
    }
}

除夕夜外婆来了,外婆喜欢看小品…发现还得修改客户端类,这就造成了很大的不便,来一个人就要修改客户端类,那么,我们能不能做到即使家里来了客人,客户端类也不做任何改动呢?

简单工厂模式可以改善这个问题,简单工厂模式的核心思想就是用一个单独的类来创建类的实例,对调用方来说,只需要知道工厂类以及各对象的基类就可以了。

首先提取出一个频道接口,拥有观看这个方法,新闻频道、时装频道、卡通频道均实现继承频道接口,UML类图如下:

简单工厂模式类图

简单工厂模式类图

  • 频道接口
public interface Channel {
    void watch();
}
  • 新闻频道类
public class News implements Channel {
    @Override
    public void watch() {
        System.out.print("watch news");
    }
}
  • 时装频道类
public class Fashion implements Channel{
    @Override
    public void watch() {
        System.out.print("watch fashion");
    }
}
  • 卡通频道类
public class Cartoon implements Channel {
    @Override
    public void watch() {
        System.out.print("watch cartoon");
    }
}

我们将实例化新闻频道等各个频道的功能集成在一个工厂类里,只需要输入相应的人,就能实例化出相应的频道。

  • 频道工厂类
public class ChannelFactory {
    public static Channel createChannel(String person) {
        Channel channel = null;
        switch (person) {
            case "father" :
                channel = new News();
                break;
            case "mather" :
                channel = new Fashion();
                break;
            case "child" :
                channel = new Cartoon();
                break;
        }
        return channel;
    }
}
  • 客户端测试类
public class Client {
    public static void main(String[] args) {
        Channel channel = ChannelFactory.createChannel("child");
        channel.watch();
    }
}

运行结果:
watch cartoon

现在,不管谁来了,我们只需要加一个频道实现,并且修改一下工厂类就行,并不需要修改客户端类了,也就是不需要修改调用方了。

简单工厂模式的核心在于工厂类,用户给出指定的信息,就可以获得一个他想要的实例,而并不需要知道实例在内部是如何创建出来的,对软件体系结构具有优化作用。

但由于所有实例的创建逻辑都集中在工厂类中,新加一个类就得修改工厂类,所以它违反了高内聚的责任分配原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值