工厂模式是创建型设计模式之一,主要是作为提供一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。工厂模式分为三种类型:简单工厂模式、工厂方法模式、抽象工厂模式 。简单工厂模式是最常用的一种,它提供了一种创建对象的最佳方式。在简单工厂模式中,我们在创建对象时不需要知道具体的类名,只需要知道需要什么类型的类即可。而工厂方法模式则是将对象的创建过程交给了客户端来完成,这样可以降低系统的耦合度。抽象工厂模式则是提供了一种创建一系列产品对象的方式,它可以将一组具有同一主题的产品放在同一个工厂中进行生产。
在计算机科学中,设计模式是一种被广泛接受并用于解决特定问题的优秀解决方案,它们提供了一种可重用的方法,使得代码更易于理解、修改和维护,我们将讨论一种非常实用的设计模式——工厂模式。
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
工厂模式的主要角色有以下几个:
1、抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。
2、具体工厂(Concrete Factory):实现抽象工厂所定义的接口,用于创建具体的产品类。
3、抽象产品(Abstract Product):定义产品的公共接口。
4、具体产品(Concrete Product):实现抽象产品所定义的接口,提供具体的产品实现。
5、客户端(Client):使用抽象工厂来获取具体的产品实例。
下面我们通过一个简单的例子来说明工厂模式的使用方法:
假设我们有一个电子产品生产厂,需要生产电脑、手机和平板等设备,这些设备都有一些共同的属性和行为,例如都有屏幕、键盘和电池等,但是它们的外观和功能有所不同,我们可以使用工厂模式来创建这些设备,而不是直接在客户端代码中创建它们。
我们需要定义一个共同的接口Device
,它包含所有设备的共同属性和行为:
public interface Device { void display(); }
我们需要定义三个具体的设备类:Computer
、Phone
和Tablet
,它们都实现了Device
接口:
public class Computer implements Device { @Override public void display() { System.out.println("This is a computer."); } } public class Phone implements Device { @Override public void display() { System.out.println("This is a phone."); } } public class Tablet implements Device { @Override public void display() { System.out.println("This is a tablet."); } }
我们需要定义一个抽象工厂类DeviceFactory
,它负责创建具体的设备实例:
public abstract class DeviceFactory { public abstract Device createDevice(); }
我们需要为每种设备创建一个具体工厂类:
public class ComputerFactory extends DeviceFactory { @Override public Device createDevice() { return new Computer(); } } public class PhoneFactory extends DeviceFactory { @Override public Device createDevice() { return new Phone(); } } public class TabletFactory extends DeviceFactory { @Override public Device createDevice() { return new Tablet(); } }
我们需要在客户端代码中使用抽象工厂来创建设备实例:
public class Client { public static void main(String[] args) { DeviceFactory computerFactory = new ComputerFactory(); Device computer = computerFactory.createDevice(); computer.display(); // This is a computer. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""''''''''''''''''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"'''''''''''''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' '' '' '' '' '' '' '' '' '' '' '' """ " " " " " " " " " " " " " " " " " " " " " " " " " " " "; nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNNM