抽象工厂模式:当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
抽象工厂模式与工厂方法模式的区别:
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
类图:
场景:现在有2个产品,手机(Phone)和平板(Pad),我们需要一个工厂(IFactory)生产2中产品,现在有2个品牌小米,苹果都做这产品,并且有着自己的工厂。
代码:
产品的基类与实现的接口
public interface ICall {
void call();
}
public abstract class Phone implements ICall {
}
public interface IPlay {
void play();
}
public abstract class Pad implements IPlay {
}
抽象工厂:
public interface IFactory {
Phone createPhone();
Pad createPad();
}
小米产品:
public class XiaoMiPhone extends Phone {
@Override
public void call() {
Log.e("zhang", "用小米手机打电话" );
}
}
public class XiaoMiPad extends Pad {
@Override
public void play() {
Log.e("zhang", "用小米平板玩游戏" );
}
}
小米的工厂:
public class XiaoMiFactory implements IFactory {
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
@Override
public Pad createPad() {
return new XiaoMiPad();
}
}
苹果的产品
public class IPhone extends Phone {
@Override
public void call() {
Log.e("zhang", "用iPhone打电话" );
}
}
public class IPad extends Pad {
@Override
public void play() {
Log.e("zhang", "用iPad玩游戏" );
}
}
苹果的工厂:
public class AppleFactory implements IFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
@Override
public Pad createPad() {
return new IPad();
}
}
程序入口:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IFactory factory = new XiaoMiFactory();
operate(factory);
factory = new AppleFactory();
operate(factory);
}
public void operate(IFactory factory) {
Phone phone = factory.createPhone();
phone.call();
Pad pad = factory.createPad();
pad.play();
}
}