【Java设计模式02】——工厂模式

来源:互联网 发布:淘宝小北名表靠谱吗 编辑:程序博客网 时间:2024/06/05 07:42

转载:http://blog.csdn.net/xu__cg/article/details/52909769


工厂模式:主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性。 

核心本质:

  • 实例化对象,用工厂方法代替new操作。
  • 将选择实现类、创建对象统一管理和控制,从而将调用者跟我们实现类解耦。


工厂模式分类

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)

一、简单工厂模式

组成结构:(1)抽象产品接口、(2)具体产品类、 (3)简单工厂类

//抽象产品接口:Carinterface Car {void run();}//具体产品类:Audi、Bydclass Audi implements Car {@Overridepublic void run() {System.out.println("奥迪车!");}}class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪车!");}}//简单工厂类:SimpleFactoryclass SimpleFactory {//按类型制造车public Car createCar(String type) {if("Audi".equals(type)) {return new Audi();}else if("Byd".equals(type)) {return new Byd();}else {return null;}}}public class SimpleFactoryTest {public static void main(String[] args) {//创建简单工厂对象SimpleFactory factory = new SimpleFactory();Car audiCar = factory.createCar("Audi");Car bydCar = factory.createCar("Byd");audiCar.run();bydCar.run();}}
缺点:每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createCar(String type)方法需要新增case),这显然是违背开闭原则的 。


二、工厂方法模式

工厂方法模式:是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定哪一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

组成结构:(1)抽象产品接口、(2)具体产品类、 (3)抽象工厂接口、 (4)具体工厂类

//抽象产品类:Carinterface Car {void run();}//具体产品类:Audi、Bydclass Audi implements Car {@Overridepublic void run() {System.out.println("奥迪车!");}}class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪车!");}}//抽象工厂类:CarFactoryinterface CarFactory {Car createCar();}//具体工厂类:AudiFactory、BydFactoryclass AudiFactory implements CarFactory {@Overridepublic Car createCar() {return new Audi();}}class BydFactory implements CarFactory {@Overridepublic Car createCar() {return new Byd();}}public class FactoryMethodTest {public static void main(String[] args) {//创建各自的工厂CarFactory audiFactory = new AudiFactory();CarFactory bydFactory = new BydFactory();//生产各自的产品Car audi = audiFactory.createCar();Car byd = bydFactory.createCar();audi.run();byd.run();}}

三、抽象工厂模式

       在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。如构成一辆车需要有发动机,座椅,轮胎等配件,而每个配件又有多种(如发动机有A,B不同型号),那么该抽象产品构成一个产品族。 
        当每个抽象产品都有多于一个的具体子类的时候(发动机有型号A和B两种,座椅也有型号A和B两种),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品轮胎有两个具体产品轮胎A和轮胎B)。抽象工厂模式提供两个具体工厂角色(A型汽车系列工厂和B型系列工厂),分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

组成结构:(1)各类产品的抽象类、(2)各类产品的子类、(3)工厂抽象类、(4)各种工厂子类
//发动机接口及其子类A、Binterface Engine {void run();}class EngineA implements Engine {@Overridepublic void run() {System.out.println("A类Engine, 转的快!");}}class EngineB implements Engine {@Overridepublic void run() {System.out.println("B类Engine, 转的慢!");}}//座椅接口及其子类A、Binterface Seat {void message();}class SeatA implements Seat {@Overridepublic void message() {System.out.println("A类Seat, 可以自动按摩!");}}class SeatB implements Seat {@Overridepublic void message() {System.out.println("B类Seat, 可以调整高低!");}}//汽车工厂接口interface CarFactory {//可以生产所有的产品Engine createEngine();Seat createSeat();}//A类汽车工厂, 能够生产EngineA和SeatAclass CarFactoryA implements CarFactory {@Overridepublic Engine createEngine() {return new EngineA();}@Overridepublic Seat createSeat() {return new SeatA();}}//B类汽车工厂, 能够生产EngineB和SeatBclass CarFactoryB implements CarFactory {@Overridepublic Engine createEngine() {return new EngineB();}@Overridepublic Seat createSeat() {return new SeatB();}}public class AbstractFactory {public static void main(String[] args) {CarFactory factoryA = new CarFactoryA();Engine eA = factoryA.createEngine();Seat sA = factoryA.createSeat();eA.run();sA.message();CarFactory factoryB = new CarFactoryB();Engine eB = factoryB.createEngine();Seat sB = factoryB.createSeat();eB.run();sB.message();}}
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。



0 0