本文主要为的是在准备软件设计师考试的小伙伴准备,帮助大家更好的理解工厂模式。
工厂模式主要有
- 简单工厂
- 工厂方法
- 抽象工厂
简单工厂
咱们先来看简单工厂,假设现在有手机制造商要制造手机,我们都知道手机制造非常麻烦,比如手机有高端机子和低端机子。于是聪明的你就想到了定义一个接口,然后实现类去实现自己的机子。
interface Phone {
void show();
}
class lowPhone implements Phone {
@Override
public void show() {
System.out.println("我是lowPhone 手机");
}
}
class HighPhone implements Phone {
@Override
public void show() {
System.out.println("我是HighPhone 手机");
}
}
这时候,有了手机那么谁来帮我们制作呢?总不可能自己一台一台的制作吧,于是你又想到了找个工厂来帮我们生产。
class PhoneFactory {
public Phone createPhone(String type) {
Phone phone = null;
if (type.equals("low")) {
phone = new lowPhone ();
} else if ("high".equals(type)) {
phone = new HighPhone ();
}
return phone;
}
}
你只要告诉工厂,你要什么牌子的手机,工厂就会帮你制作。
public static void main(String[] args) {
PhoneFactory phoneFactory=new PhoneFactory();
Phone phone = phoneFactory.createPhone("low");
phone.show();
}
这就叫简单工厂模式,很好,你已经精通了简单工厂模式。
工厂方法
于是乎,你又想到了,那我如果想制作一个中断手机呢?总不可能在工厂类中在IF-ELSE的判断吧,于是聪明的你经过思考就想到了工厂方法模式。把工厂抽象出来
interface Factory {
Phone createPhone();
}
class LowFactory implements Factory {
@Override
public Phone createPhone() {
Phone iphone=new lowPhone ();
//手机制作中*******
return iphone;
}
}
class HighFactory implements Factory{
@Override
public Phone createPhone() {
Phone high=new HighPhone ();
return high;
}
}
这样,你想要什么手机,就去创建一个工厂
public static void main(String[] args) {
Factory diduan = new LowFactory ();
Phone phone = diduan.createPhone();
phone.show();
}
怎么样,是不是很简单?恭喜你又精通了工厂方法模式。那么下面我们来看看抽象工厂
抽象工厂
此时,作为老板的你,不甘于只做手机,你又想做点耳机。耳机也有多个牌子的,也有高端低端中端的,于是乎,你又想起了抽象工厂。
让高端的工厂生产高端的手机、耳机。低端的工厂生产低端的手机、耳机。
interface Factory {
Phone createPhone();
headset createHeadSet();
}
class LowFactory implements Factory {
@Override
public Phone createPhone() {
Phone lowPhone=new lowPhone ();
//手机制作中*******
return lowPhone;
}
@Override
public headset createHeadSet() {
Headset lowHeadset=new LowHeadset();
return lowHeadset;
}
}
class HighFactory implements Factory{
@Override
public Phone createPhone() {
Phone high=new HighPhone ();
return high;
}
@Override
public headset createHeadSet() {
Headset hignHeadset=new HignHeadset();
return hignHeadset;
}
}