最近在写安卓项目,在引入rxJava和Retrofit发现大量引用的建造者模式。那在此就记录和简单介绍一下两者的区别和使用方法。
工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象。
1、1 工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
1、2 应用场景
- 对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等。
2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。
举个例子:自主创建需要的产品对象(小米和苹果),达到增加新产品时无需修改其他具体的工厂和具体类的目的。
1.3 工厂模式代码
/**
* 手机接口
* @author li
*/
public interface Moblie{
// TODO
}
/**
* 手机工厂接口
* @author li
*/
public interface MobileFactor{
public Moblie productMobile();
}
public class iphone implements Moblie {
// TODO
}
public class Mi implements Moblie {
// TODO
}
public class MotorolaFactor implements MobileFactor {
@Override
public Moblie productMobile() {
return new iphone ();
}
}
public class NokiaFactor implements MobileFactor {
@Override
public Moblie productMobile() {
return new Mi();
}
}
主类:
public static void main(String[] args) {
MobileFactor mf = new MI Factor(); // 需要什么产品就创造什么工厂
Moblie m;
m = mf.productMobile();
}
1、4抽象工厂的使用
1.4.1 定义接口
public abstract class ComputerFactor{
CPU cpu;
HardDisk hd;
MainBoard mb;
public void show() {
// 利用传进来的组件做事
}
}
1.4.3 实现类
public class IBM extends ComputerFactor {
public IBM() {
cpu = new AMD();
hd = new Maxtor();
mb = new MSIK7N2G();
}
}
1.4.3主类
public static void main(String[] args) {
IBM ibm = new IBM();
ibm.show();
}
1.4.4 抽象工厂优缺点
抽象工厂模式与工厂方法模式最大的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
优点:抽象工厂模式同样具备隔离具体类生成。并且当一个产品族中的多个对象设计成一起工作时,他能够保证客户端始终只使用同一个产品族中的对象。
缺点:再添加新的产品对象时,难以扩展抽象工厂模式以便产生新种类产品。
然后比较最多的应该就是抽象工厂和建造者模式,下面就简单介绍一下建造者模式。
2、1建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
2.2应用场景
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
举个例子:1、工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
2、汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))
2、3 建造者模式代码
示例分析:
1、小高定制买车,老板(Diretor)和小高(Client)进行需求沟通(越野?日常?撩妹?)
2、了解需求后,电脑城老板将小高需求划分为各个部件(Builder)的建造请求(发动机、车身、颜色)
3、指挥装机人员(ConcreteBuilder)去构建组件;
4、将组件组装起来成小高需要的汽车(Product)
2、3、1定义组装过程(Builder):组装汽车的过程
public abstract class Builder {
//第一步:装发动机
public abstract void BuildEngine();
//第二步:装车身
public abstract void BuildBody();
//第三步:车身颜色
public abstract void BuildColor();
//返回产品的方法:获得组装好的汽车
public abstract Car GetCcar();
}
2、3、2 老板委派任务给组装人员(Director)
public class Director{
//指挥装机人员组装电脑
public void Construct(Builder builder){
builder. BuildEngine();
builder.BuildBody();;
builder. BuildColor();
}
}
2、3、3创建具体的建造者(ConcreteBuilder):组装人员
//装车人员
public class ConcreteBuilder extend Builder{
//创建产品实例
Car car = new Car();
//组装产品
@Override
public void BuildEngine(){
car.Add("组装发动机")
}
@Override
public void BuildBody(){
car.Add("组装车身")
}
@Override
public void BuildColor(){
car.Add("喷漆")
}
//返回组装成功的汽车
@Override
public Car GetCar(){
return car
}
}
2、3、4定义具体产品类(Product):汽车
public class Car{
//汽车组件的集合
private List<String> parts = new ArrayList<String>();
//用于将组件组装到汽车里
public void Add(String part){
parts.add(part);
}
public void Show(){
for (int i = 0;i<parts.size();i++){
System.out.println(“组件”+parts.get(i)+“装好了”);
}
System.out.println(“组装完成,请验收”);
}
}
2、3、5客户端调用-买车
public class Builder Pattern{
public static void main(String[] args){
//逛了很久终于发现一家合适的汽车店
//找到该店的老板和装机人员
Director director = new Director();
Builder builder = new ConcreteBuilder();
//沟通需求后,老板叫装机人员去装电脑
director.Construct(builder);
//装完后,组装人员搬来组装好的电脑
Car car = builder.GetCar();
//组装人员展示电脑给小高看
car.Show();
}
}
2、4 建造模式优缺点
优点:1、将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
2、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
缺点:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
3抽象工厂和建造者模式的区别
抽象工厂模式比建造者模式的尺度要大,它关注产品整体,而建造者模式关注构建过程,因此建造者模式可以很容易地构建出一个崭新的产品,只要导演类能够提供具体的工艺流程。也正因为如此,两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂方法模式。而建造者模式可以用在构件的装配方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便地扩展和维护系统。