设计模式系列(四)---工厂模式

设计模式系列(四)---工厂模式

目录

工厂模式的种类

  • 工厂模式分为两类:工厂方法模式和抽象工厂模式
  • 简单工厂是工厂方法模式的一种特例

简单工厂模式

代码实现


abstract class Person
{
    public abstract void sayHello();
}

class GDPerson extends Person
{
    public void sayHello()
    {
        System.out.println("我是广东人");
    }
}

class BJPerson extends Person
{
    public void sayHello()
    {
        System.out.println("我是北京人");
    }
}
class PersonFactory
{
    static final int GD=1;
    static final int BJ=2;
    public static Person createPerson(int area)
    {
        switch (area)
        {
            case GD:
                return new GDPerson();
            case BJ:
                return new BJPerson();
            default:
                return null;
        }
    }
}
public class Demo5 {
    public static void main(String[] args) {
        Person gdPerson=PersonFactory.createPerson(PersonFactory.GD);
        gdPerson.sayHello();
        Person bjPerson=PersonFactory.createPerson(PersonFactory.BJ);
        bjPerson.sayHello();
    }
}

开放封闭原则

  • 开放封闭原则是面向对象原则的核心
  • 对扩展开放,意味着需求或变化是们可以对现有代码进行扩展,以适应新的情况
  • 对修改封闭,意味这类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改

分析

  • 传入要创建的对象的类型,然根据传入的类型,创建相应的对象
  • 调用者不必知道对象是如何创建的,只要传入相应的参数就可以

  • 但是,如果这个时候需要添加其他的type,那么就要增加case,也就是对设计完成的类进行修改,而这样就违背了开放封闭原则

工厂方法模式

代码实现

public interface PersonFactory
{
    Person createPerson();
}
class GDFactory implements PersonFactory
{

    public Person createPerson() {
        return new GDPerson();
    }
    
}
class BJFactory implements PersonFactory
{
    public Person createPerson()
    {
        return new BJPerson();
    }
}

public class Demo5 {
    public static void main(String[] args) {
        PersonFactory gdFactory=new GDFactory();
        Person gdPerson=gdFactory.createPerson();
        PersonFactory bjFactory=new BJFactory();
        Person bjPerson=bjFactory.createPerson();
        
    }
}

分析

  • 定义一个用于创建对象的接口,让子类决定实例化哪个类,在这里体现为创建一个PersonFactory接口,根据要实例化的类(Person的类型),创建实现这个接口的一个工厂类(BJFactory或者是GDFactory)。
  • 这样的话,当增加一个新的类的时候,不用对一个已经设计完成的类进行修改,这样就不会破坏开放封闭原则。
  • 但是随着类的增多(比如SHPeroson和USAPerson),那么就要对应创建多个工厂类

抽象工厂模式

abstract class Animal
{
    public abstract void sayHello();
}

class Cat extends Animal
{
    public void sayHello()
    {
        System.out.println("瞄");
    }
}
public interface Factory
{
    Person createPerson();
    Animal createAnimal();
}

class Factory1 implements Factory
{
    public Person createPerson()
    {
        return new BJPerson();
    }
    public Animal createAnimal()
    {
        return new Cat();
    }
}

分析

  • 对比工厂方法模式。它与工厂方法唯一的区别就是工厂的接口里是不再是创建一个类型(不止是Person还有Animal)。

对比

  • 可以体会到,创建一个实例的时候,我们将判断的逻辑放到工程的类的内部(switch或者if else)。而工厂方法模式的话,则是将判断的逻辑转移到客户端,要创建什么类型的实例,就创建对应的工厂来获取对象。

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

作者:jiajun 出处: http://www.cnblogs.com/-new/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

posted @ 2017-09-17 09:30 jiajun_geek 阅读(...) 评论(...) 编辑 收藏