设计模式——工厂设计模式

  工厂设计模式属于设计模式中的创建型模式,是在Java中常用的设计模式之一。创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  工厂模式一般指的是简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)。其中简单工厂模式不属于23种设计模式,因为其不符合开闭原则,每次增加新的产品就需要修改工厂类,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护。

一、简单工厂模式

  简单工厂模式的核心是定义一个创建对象的工厂类,将对象的创建交由工厂类来执行,降低系统的耦合度,使得修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。

UML类图:

// 产品类
abstract class Television{
    public Television(){}
}

public class Television01 extends Television{
    public Television01(){
        System.out.println("Television01");
    }
}

public class Television02 extends Television{
    public Television02(){
        System.out.println("Television02");
    }
}

// 工厂类
public classs Factory{
    public Television createTelevision(int type) {
	switch (type) {
	    case 1:
		return new Television01();
	    case 2:
		return new Television02();
	    default:
		break;
	}
	return null;
    }
}

// 测试
public class Customer {
    public static void main(String[] args) {
        Factory factory = new Factory();
	Television tv1 = factory.createTelevision(1);
	Television tv2 = factory.createTelevision(2);
    }
}

二、工厂方法模式

  工厂方法模式相对于简单工厂模式,将工厂类抽象了出来,与简单工厂模式相同,还是将创建对象的任务交由工厂类,不过是由具体的工厂类来决定创建什么对象,当需要增加新产品时,只需要增加对应的产品类和工厂实现类即可。这样就符合了开闭原则,扩展时不必去修改原来的代码。

UML类图:

// 产品类
abstract class Television{
    public Television(){}
}

public class Television01 extends Television{
    public Television01(){
        System.out.println("Television01");
    }
}

public class Television02 extends Television{
    public Television02(){
        System.out.println("Television02");
    }
}

// 工厂类
interface class FactoryTelevision{
    Television createTelevision();
}

public class FactoryTelevision01 implements FactoryTelevision{
    @Override
    public Television01 createTelevision() {
	return new Television01();
    }
}
public class FactoryTelevision02 implements FactoryTelevision{
    @Override
    public Television02 createTelevision() {
	return new Television02();
    }
}

// 测试
public class Customer {
    public static void main(String[] args) {
        FactoryTelevision01 factoryTV1 = new FactoryTelevision01();
        Television01 television01 = factoryTV1.createTelevision();
	FactoryTelevision02 factoryTV2 = new FactoryTelevision02();
        Television02 television02 = factoryTV2.createTelevision();
    }
}

三、抽象工厂模式

  在工厂方法模式中,我们使用一个工厂创建一个对象,一个具体工厂对应一个具体对象,但有时候我们需要一个工厂能够提供多个对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。
  例如:一个品牌工厂不止有一款产品,这个工厂可能生产冰箱、空调、热水器等等,工厂设计模式已经不能够满足我们的需求了,因为工厂设计模式只能产出单一的产品,这个时候就需要使用抽象工厂模式。

UML类图:


// 产品类
public class Television{

}

public class Television01{
    public Television01(){
        System.out.println("Television01");
    }
}

public class Television02{
    public Television02(){
        System.out.println("Television02");
    }
}

public class DVD{

}

public class DVD01{
    public DVD01(){
        System.out.println("DVD01");
    }
}

public class DVD02{
    public DVD02(){
        System.out.println("DVD02");
    }
}
// 工厂类
interface class AbstractFactory{
    public Television createTelevision();

    public DVD createDVD();
}

public class Factory01 implements AbstractFactory{     
    @Override  
    public Television createTelevision() {    
        return new Television01();  
    }  
    @Override  
    public DVD createDVD() {  
        return new DVD01();  
    }  
} 

public class Factory02 implements AbstractFactory{     
    @Override  
    public Television createTelevision() {    
        return new Television02();  
    }  
    @Override  
    public DVD createDVD() {  
        return new DVD02();  
    }  
} 

// 测试
public class Customer {  
    public static void main(String[] args){  
        //生产工厂1系列产品
        Factory01 factory01 = new Factory01();  
        factory01.createTelevision();
        factory01.createDVD();
          
        //生产工厂2系列产品
        Factory02 factory02 = new Factory02();  
        factory02.createTelevision();
        factory02.createDVD();
    }  
}
posted @ 2022-07-15 16:16  B1nbin  阅读(118)  评论(0编辑  收藏  举报
/*
*/