工厂模式
解决问题
轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程
方案
建立一个工厂来创建对象,用户调用工厂的创建对象方法.
结构
- 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
适用性
- 创建对象需要大量重复的代码。
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
- 一个类通过其子类来指定创建哪个对象。
优缺点
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加.
- 在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
经典实现
泡茶
拿泡茶为例,茶叶有好多种类,比如龙井、碧螺春、毛尖等。
public interface ITea {
// 沏茶
public void makeTea();
}
public class LongjingTea implements ITea {
@Override
public void makeTea() {
System.out.println("西湖龙井");
}
}
public class BiluochunTea implements ITea{
@Override
public void makeTea() {
System.out.println("碧螺春");
}
}
/**
* 生产茶叶的统一接口
*/
public interface ITeaFactory {
// 生产茶叶
public ITea createTea();
}
public class LongjingTeaFactory implements ITeaFactory{
@Override
public ITea createTea() {
return new LongjingTea();
}
}
public class BiluochunTeaFactory implements ITeaFactory{
@Override
public ITea createTea() {
return new BiluochunTea();
}
}
public class FactoryMethodTest {
public static void main(String[] args) {
ITeaFactory factory = new LongjingTeaFactory();
factory.createTea();
factory = new BiluochunTeaFactory();
factory.createTea();
}
}
目前实现过
抽象工厂模式
解决问题
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
方案
在一个产品族里面,定义多个产品。即在一个工厂里聚合多个同类产品。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构
- 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
经典实现
public interface PC {
void make();
}
public class MiPC implements PC {
public MiPC() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make xiaomi PC!");
}
}
public class MAC implements PC {
public MAC() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make MAC!");
}
}
public interface AbstractFactory {
Phone makePhone();
PC makePC();
}
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone makePhone() {
return new MiPhone();
}
@Override
public PC makePC() {
return new MiPC();
}
}
public class AppleFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new IPhone();
}
@Override
public PC makePC() {
return new MAC();
}
}
public class Demo {
public static void main(String[] arg) {
AbstractFactory miFactory = new XiaoMiFactory();
AbstractFactory appleFactory = new AppleFactory();
miFactory.makePhone(); // make xiaomi phone!
miFactory.makePC(); // make xiaomi PC!
appleFactory.makePhone(); // make iphone!
appleFactory.makePC(); // make MAC!
}
}
区别
区别
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。