23种设计模式之-工厂模式(简单工厂,静态工厂,抽象工厂)详解

文章结构

1.设计模式介绍
2.简单工厂模式
3.静态工厂模式
4.抽象工厂模式
5.总结

1.设计模式介绍

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

1.1设计模式的分类

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 等。本文我们先介绍第一种模式——工厂模式!

2.简单工厂模式

简单工厂模式可以理解为:简单工厂模式是由一个工厂对象接收到的消息来判断要生产也就是创建哪一个类的对象实例,然后返回创建的实例对象!

借鉴 大话设计模式案例分析可以知道一下优缺点

 优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端 
       和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。

 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

下面上案例代码,

/**
 * 创建一个父接口
 */
public interface Car {
    //车描述的方法
    void myCard();
}
/**
 * 

* 实现父接口 实现接口方法 *

*/ public class GreenCard implements Car { //给车上颜色 绿色 public void myCard() { System.out.println("GreenCard.myCard---->我是一辆绿色的车!"); } }
/**
 * 

* 实现父接口 实现方法 *

*/ public class RedCard implements Car { //给车上颜色红色 public void myCard() { System.out.println("RedCard.myCard------>我是一辆红色的车!"); } }
/**
 * 

* 创建车的工厂类 *

*/ public class CreateCarFactory { //简单工厂类的方法----》根据用户传递的信息来创建指定的对象实例 public Car createCar(String carName) { if (carName == null) return null; if (carName.equals("红色")) { return new RedCard(); } else if (carName.equals("绿色")) { return new GreenCard(); } return null; } }
测试类
public class App {
    public static void main(String[] args) {
        //创建工厂类
        CreateCarFactory factory = new CreateCarFactory();
        Car redCar = factory.createCar("红色");
        Car greenCar = factory.createCar("绿色");
        System.out.println("greenCar.getClass() = " + greenCar.getClass());
        greenCar.myCard();
        System.out.println("redCar.getClass() = " + redCar.getClass());
        redCar.myCard();
        }
}

简单工厂模式测试打印如下:

greenCar.getClass() = class com.iArchie.designMode.classify.factoryPatternExample.GreenCard
GreenCard.myCard---->我是一辆绿色的车!
redCar.getClass() = class com.iArchie.designMode.classify.factoryPatternExample.RedCard
RedCard.myCard------>我是一辆红色的车!

3.静态工厂模式

静态工厂的好处就是由一个工厂对象接收到的消息来判断直接调用的静态方法来创建实例。
我们一样在简单工厂模式代码做增加,在CreateCarFactory工厂类中加一个静态方法 如下:

 //工厂类的静态方法
    public static Car createCarStatic(String carName) {
        if (carName == null) {
            return null;
        }
        if (carName.equals("红色")) {
            return new RedCard();
        } else if (carName.equals("绿色")) {
            return new GreenCard();
        }
        return null;
    }

然后在测试类中编写如下代码:

		//调用工厂类中的静态方法,不需要创建实例,直接调用即可
 		Car greenCar = CreateCarFactory.createCarStatic("绿色");
        Car redCar = CreateCarFactory.createCarStatic("红色");
        System.out.println("redCar.getClass() = " + redCar.getClass());
        redCar.myCard();
        System.out.println("greenCar.getClass() = " + greenCar.getClass());
        greenCar.myCard();

测试类中打印输出如下:

redCar.getClass()静态工厂 = class com.iArchie.designMode.classify.factoryPatternExample.RedCard
RedCard.myCard------>我是一辆红色的车!
greenCar.getClass()静态工厂 = class com.iArchie.designMode.classify.factoryPatternExample.GreenCard
GreenCard.myCard---->我是一辆绿色的车!

4.抽象工厂模式

抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
在简单工厂案例基础上演示:

/**
 * 创建一个父接口
 */
public interface Car {
    //车描述的方法
    void myCard();
}
/**
 * 

* 实现父接口 实现接口方法 *

*/ public class GreenCard implements Car { //给车上颜色 绿色 public void myCard() { System.out.println("GreenCard.myCard---->我是一辆绿色的车!"); } }
/**
 * 

* 实现父接口 实现方法 *

*/ public class RedCard implements Car { //给车上颜色红色 public void myCard() { System.out.println("RedCard.myCard------>我是一辆红色的车!"); } }
/**
 * 为抽象工厂类提供接口
 */
public interface AbstractFactory {
    Car produce();
}

创建两个子工厂类 分别实现抽象工厂提供的接口

/**
 * 绿色车工厂类
 */
public class GreenFactory implements AbstractFactory {
    public Car produce() {
        return new GreenCard();
    }
}
/**
 * 红色车工厂类
 */
public  class RedCarFactory implements AbstractFactory {
    @Override
    public Car produce() {
        return new RedCard();
    }
}

抽象工厂测试类

/**
 * 抽象工厂类测试方法
 */
public class abstractApp {
    public static void main(String[] args) {
      AbstractFactory redCarFactory = new RedCarFactory();
        Car produce = redCarFactory.produce();
        System.out.println("produce.getClass()抽象工厂 = " + produce.getClass());
        produce.myCard();
        AbstractFactory greenCar = new GreenFactory();
        Car car = greenCar.produce();
        System.out.println("car.getClass()抽象工厂 = " + car.getClass());
        car.myCard();
    }
}

测试打印信息如下:

produce.getClass() = class com.iArchie.designMode.classify.factoryPatternExample.RedCard
RedCard.myCard------>我是一辆红色的车!
car.getClass() = class com.iArchie.designMode.classify.factoryPatternExample.GreenCard
GreenCard.myCard---->我是一辆绿色的车!

5.总结

在简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不需要担心是普通工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。总之,我们只需要知道能否降低代码的耦合度就行了。

你可能感兴趣的:(设计模式)