工厂,顾名思义是生产很多产品的地方,而且会有不同种类的产品,例如手机工厂,可能会生产小米手机、华为手机、诺基亚手机等等,这些不同品牌的手机可能会有自己单独的生产车间,这样一个手机工厂就相当于被分成了小米手机车间,生产小米手机、华为手机车间,生产华为手机、诺基亚手机车间,生产诺基亚手机。这样的引入大家应该比较明了的知道了工厂是什么。
工厂模式
- 简单工厂:其实它不是一个设计模式,而是一种编程习惯,但是很多开发人员会把这个编程习惯当做“工厂模式”。
- 工厂方法模式
- 抽象工厂模式
1、简单工厂
建立一个工厂,来制造对象,此时工厂只是将客户创建对象的方法收集起来,对象是由客户自己创建的,当客户需要对象时,就到工厂中创建,然后拿来使用即可。就像手机品牌商都会制造手机,当他们销售出手机时,直接到工厂中自己制造出手机,然后拿走去销售。
public class PhoneFactory{ public static Phone createPhone(String type){ Phone phone = null; if(type.equals("小米")){ phone = new XiaomiPhone(); }else if(type.equals("华为")){ phone = new HuaweiPhone(); }else if(type.equals("诺基亚")){ phone = new NuojiyaPhone(); } return phone; } } public class PhoneStore{ public Phone orderPhone(String type){ Phone phone; phone = PhoneFactory.createPhone(type); phone.box(); return phone; } //这里是其他方法 }
2、工厂方法模式
创建了一个对象接口,但由其子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
手机工厂就可以看做一个工厂方法模式,工厂是暴露给外界的对象接口,各个品牌手机生产车间都继承与工厂,都是工厂的子类,他们负责生产具体哪个品牌的手机,而工厂不负责生产手机,只负责为各个生产车间提供房屋,仪器,工人(这些都类似与抽象类中的抽象方法),工厂并不关心各个车间怎么使用这些资源,具体怎么使用,由他们自己决定(继承了抽象类的类,要实现抽象类中的抽象方法,即给出具体的实现细节)。生产车间制造出手机,就是实现了类的实例化。
//工厂类 public abstract class PhoneFactory{ public Phone orderPhone(String type){ Phone phone; phone = createPhone(type); phone.box(); return phone; } protected abstract Phone createPhone(String type); } public class XiaomiPhoneFactory extends PhoneFactory{ Phone createPhone(String item){ if(item.equals("全面屏")){ return new XiaomiFullPhone(); }else if(item.equals("音乐")){ return new XiaomiMusicPhone(); }else return null; } } //华为、诺基亚手机生产车间类似 //产品类 public abstract class Phone{ String name; String color; int price; void box(){ System.out.println("将手机打包"); } public String getName(){ return name; } } public class XiaomiFullPhone extends Phone{ public XiaomiFullPhone(){ name = "小米全面屏手机"; color = "红色"; price = 1000; } } public class XiaomiMusicPhone extends Phone{ public XiaomiFullPhone(){ name = "小米拍照手机"; color = "红色"; price = 1200; } } //订购小米全面屏手机 public class PhoneTest{ public static void main(String[] args){ PhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory(); Phone phone = xiaomiPhoneFactory.order("全面屏"); System.out.println("已经订购了一个"+phone.getName()); } }
简单工厂与工厂方法之间的差异:
简单工厂把全部的事情都在一个地方处理完毕了,而工厂方法是创建一个框架,让子类决定如何实现。简单工厂不具备工厂方法的弹性,简单工厂不能变更正在创建的产品。
工厂的好处:
将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖接口,而不是具体的类。
3、抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过抽象工厂所提供的接口,可以创建产品家族,利用这个接口书写代码,我们的代码将从实际代码中解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。因为代码从实际的产品中解耦了,所以我们可以替换不同的工厂来取得不同的行为。
手机工厂中各个品牌生产车间都会制造不同颜色的手机,为了防止从一个手机工厂中制造出的手机,会因为品牌的不同,颜色显示不同,工厂统一提供颜料。
工厂方法与抽象工厂的区别:
1、工厂方法用的是继承,抽象工厂用的是组合
2、工厂方法是用来创建对象的,整个工厂方法模式,只不过就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体类型。换句话说就是,工厂方法负责将客户从具体类型中解耦。
抽象工厂是用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例话它,然后将它传入一些针对抽象类型所写的代码中。