package com.cheng.zenofdesignpatterns.patternpk.creational;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patternpk.creational.abstractfactory_vs_builder.abstractfactory.BenzFactory;
import com.cheng.zenofdesignpatterns.patternpk.creational.abstractfactory_vs_builder.abstractfactory.CarFactory;
import com.cheng.zenofdesignpatterns.patternpk.creational.abstractfactory_vs_builder.abstractfactory.ICarAF;
import com.cheng.zenofdesignpatterns.patternpk.creational.abstractfactory_vs_builder.builder.CarDirector;
import com.cheng.zenofdesignpatterns.patternpk.creational.abstractfactory_vs_builder.builder.ICarBuilder;
import com.cheng.zenofdesignpatterns.patternpk.creational.factory_vs_builder.builder.SuperManDirector;
import com.cheng.zenofdesignpatterns.patternpk.creational.factory_vs_builder.builder.SuperMan;
import com.cheng.zenofdesignpatterns.patternpk.creational.factory_vs_builder.factory.ISuperMan;
import com.cheng.zenofdesignpatterns.patternpk.creational.factory_vs_builder.factory.SuperManFactory;
public class ZoDPCreationalPKActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("创建型模式大PK");
String content = "包括:\n" +
"简单工厂模式(Simple Factory)\n" +
"工厂方法模式(Factory Method)\n" +
"抽象工厂模式(Abstract Factory)\n" +
"创建者模式(Builder)\n" +
"原型模式(Prototype)\n" +
"单例模式(Singleton)\n\n" +
"1. 工厂方法模式 VS 建造者模式\n" +
"工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在" +
"通过一步一步地精确构造创建出一个复杂的对象。举个简单的例子来说明两者的差异,如要" +
"制造一个超人,如果使用工厂方法模式,直接生产出来的就是一个力大无穷、能够飞翔、内" +
"裤外穿的超人;而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内" +
"裤外穿,于是一个超人就诞生了。\n" +
"可以看到,在建立超人的过程中,建造者必须关注超人的各个部件,而工厂方法模式则只关" +
"注超人的整体,这就是两者的区别。\n\n" +
"2. 最佳实践\n" +
"工厂方法模式和建造者模式都属于对象创建类模式,都用来创建类的对象。但它们之间的区" +
"别还是比较明显的。\n" +
"- 意图不同\n" +
"在工厂方法模式里,我们关注的是一个产品整体,如超人整体,无须关心产品的各部分是如" +
"何创建出来的;但在建造者模式中,一个具体产品的生产是依赖各个部件的产生以及装配顺" +
"序,它关注的是‘由零件一步一步地组装出产品对象’。简单地说,工厂模式是一个对象创建" +
"的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的" +
"创建过程。\n" +
"- 产品的复杂度不同\n" +
"工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模" +
"式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是" +
"说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的" +
"粒度比较粗,建造者模式的产品对象粒度比较细。\n" +
"两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象," +
"还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细" +
"关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。\n\n" +
"3. 抽象工厂模式 VS 建造者模式\n" +
"抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一个系列产品:具有不同分" +
"类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么" +
"工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组" +
"装零配件而产生一个新产品,两者的区别还是比较明显的,下面通过一个例子来说明。\n" +
"现代化的汽车工厂能够批量生产汽车(不考虑手工打造的豪华车)。不同的工厂生产不同" +
"的汽车,宝马工厂生产宝马牌子的车,奔驰工厂生产奔驰牌子的车。车不仅具有不同品牌," +
"还有不同的用途分类,如商务车Van,运动型车SUV等,按照两种设计模式分别实现车辆的" +
"生产过程。\n\n" +
"4. 最佳实践\n" +
"注意看上面的描述,在抽象工厂模式中使用‘工厂’来描述构建者,而在建造者模式中使用‘" +
"车间’来描述构建者,其实已经在说它们两者的区别了,抽象工厂模式就好比是一个一个的" +
"工厂,宝马车工厂生产宝马SUV和宝马VAN,奔驰车工厂生产奔驰SUV和奔驰VAN,它是从一" +
"个更高层次去看对象的构建,具体到工厂内部还有很多的车间,如制造引擎的车间、装配引" +
"擎的车间等,但这些都是隐藏在工厂内部的细节,对外不公布。也就是对领导者来说,他只" +
"关心一个工厂到底是生产什么产品的,不用关心具体怎么生产。而建造者模式就不同了,它" +
"是由车间组成,不同的车间完成不同的创建和装配任务,一个完整的汽车生产过程需要引擎" +
"制造车间、引擎装配车间的配合才能完成,它们配合的基础就是设计蓝图,而这个蓝图是掌" +
"握在车间主任(导演类)手中,它给建造车间什么蓝图就能生产什么产品,建造者模式更关" +
"心建造过程。虽然从外界看来一个车间还是生产车辆,但是这个车间的转型是非常快的,只" +
"要重新设计一个蓝图,即可产生不同的产品,这有赖于建造者模式的功劳。\n" +
"相对来说,抽象工厂模式比建造者模式的尺度要大,它关注产品整体,而建造者模式关注构" +
"建过程,因此建造者模式可以很容易地构建出一个崭新的产品,只要导演类能够提供具体的" +
"工艺流程。也正因为如此,两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提" +
"供一个封装良好的对象,则可以选择抽象工厂方法模式。而建造者模式可以用在构件的装配" +
"方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生一个新的对象,它可以产" +
"生一个非常灵活的架构,方便地扩展和维护系统。";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. 使用工厂方法生产超人
// 生产一个成年超人
ISuperMan adultSuperMan = SuperManFactory.createSuperMan("adult");
// 展示一下超人的技能
adultSuperMan.specialTalent();
// 生产一个未成年超人
ISuperMan childSuperMan = SuperManFactory.createSuperMan("child");
// 展示一下超人的技能
childSuperMan.specialTalent();
// 2. 使用建造者模式生产超人
// 建造一个成年超人
SuperMan adultSuperMan2 = SuperManDirector.getAdultSuperMan();
// 展示一下超人的信息
adultSuperMan2.getSpecialTalent();
// 建造一个未成年超人
SuperMan childSuperMan2 = SuperManDirector.getChildSuperMan();
// 展示一下超人的信息
childSuperMan2.getSpecialTalent();
// 3. 使用抽象工厂生产汽车
// 给我生产一辆奔驰SUV
System.out.println("===要求生产一辆奔驰SUV===");
// 首先找到生产奔驰车的工厂
System.out.println("A、找到奔驰车工厂");
CarFactory carFactory= new BenzFactory();
// 开始生产奔驰SUV
System.out.println("B、开始生产奔驰SUV");
ICarAF benzSuv = carFactory.createSuv();
// 生产完毕,展示一下车辆信息
System.out.println("C、生产出的汽车如下:");
System.out.println("汽车品牌:"+benzSuv.getBand());
System.out.println("汽车型号:" + benzSuv.getModel());
// 4. 使用建造者模式生产汽车
// 定义出导演类
CarDirector carDirector =new CarDirector();
// 给我一辆奔驰车SUV
System.out.println("===制造一辆奔驰的SUV===");
ICarBuilder benzSuv2 = carDirector.createBenzSuv();
System.out.println(benzSuv2);
// 给我一辆宝马的商务车
System.out.println("\n===制造一辆宝马的商务车===");
ICarBuilder bmwVan2 = carDirector.createBMWVan();
System.out.println(bmwVan2);
// 给我一辆混合车型
System.out.println("\n===制造一辆混合车===");
ICarBuilder complexCar2 = carDirector.createComplexCar();
System.out.println(complexCar2);
}
}