工厂模式通常是我们在做项目时用到最多的设计模式。工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式;
学习工厂模式,首先需要理解其三大角色:工厂角色(核心),抽象产品角色,具体产品角色。
先说简单工厂模式:类图如下:
贴上代码:
抽象产品(手机)
public abstract class Phone {
public abstract void telephone();
public abstract void sendMsg();
}
具体产品(小米、苹果、诺基亚)
public class Xiaomi extends Phone{
public void telephone() {
}
public void sendMsg() {
}
public void miui(){
System.out.println("------超一流的用户体验-------");
}
}
public class Apple extends Phone{
public void telephone() {
}
public void sendMsg() {
}
public void music(){
System.out.println("---------还有谁比我音质更好?---------");
}
}
public class Nokia extends Phone{
public void telephone() {
}
public void sendMsg() {
}
}
//手机工厂
public class Fushikang{
public static Phone CreatePhone(String type){
Phone phone = null;
if("xiaomi".equals(type)){
phone = new Xiaomi();
}
if("apple".equals(type)){
phone = new Apple();
}
if("nokia".equals(type)){
phone = new Nokia();
}
return phone;
}
public static void main(String[] args) {
Xiaomi xiaomi = (Xiaomi) Fushikang.CreatePhone("xiaomi");
xiaomi.miui();
Apple apple = (Apple) Fushikang.CreatePhone("apple");
apple.music();
}
}
现在回过头来,看这三种角色:Phone(手机)是一个抽象类,传统的手机,只有打电话、发短信的功能,诺基亚在造传统的手机、小米和苹果则在原来的电话的基础上进行创新,加入更多的元素。但是它们都有一个共性,就是只管设计,不管制造。都交给了富士康了,呵呵;它们设计好手机后对富士康(工厂类)发出制造手机的请求,发送订单(type),富士康接到订单后开始生产手机(具体产品)。
但是这里就会有一个问题,什么问题呢,就是所有的手机都在富士康一家生产,这样富士康就有了绝对的话语权,哪一天富士康罢工了:结果所有的手机厂商都悲催了……随着越来越多的公司开始设计手机,魅族、酷派、乐视、360、格力、美的、TCL……订单越来越多,富士康只能不停的扩大规模,上马新的生产线,招收越来越多的员工,然后一系列的事件……终于所有人都无法忍耐了,于是开始商讨新的解决方案,商量的结果就是进行改革,让多家工厂来生产,每个公司负责制造一种手机。于是有了下面的“工厂方法模式”。
工厂方法模式:定义一个创建对象的接口,有子类决定创建哪个类的实例。
有类图看,我们会发现,工厂方法模式比原来的简单工厂模式多了一个角色(抽象工厂角色)
现在工厂变成了父类,不再具体生成手机了,而是把生产的任务交给了它的子公司去生产。这样就分流了原来的生产任务,富士康停电了,英飞达的工厂照常运行。
抽象工厂模式:是所有形态的工程模式中最为抽象和最具一般性的一种形态,可以向客户端提供一个接口,是的客户端可以在不指定产品的类型的情况下,创建多个产品组中的产品对象。
抽象工厂模式和工厂方法模式,初看起来十分相似,其实也确实非常相似,呵呵。所不同处在于:
1.工厂方法模式:针对一个产品等级结构,只有一个抽象产品类;而抽象工厂模式:针对一系列的产品等级结构,应对的是产品族概念即:应对的是产品族概念,有多个抽象产品类。
在工厂模式下,客户端只需要关注制造哪种手机,而在抽象工厂模式下,客户端则需要关注制造国内版的还是欧美版的手机。