"Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect"
ref: http://www.cnblogs.com/zhangchenliang/p/3700820.html
1. "Simple Factory"
package torv.abc;
public class HelloMain {
    public static void main(String[] args) {
        Driver.createCar("audi").drive();
    }
}
//====================================================== product car
abstract class Car {
    private String brand;
    public abstract void drive();
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brandName) {
        brand = brandName;
    }
}
//------------------------------------------------benz
class BenzCar extends Car {
    public BenzCar() {
        setBrand("Benz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--go-----");
    }
}
//------------------------------------------------bmw
class BmwCar extends Car {
    public BmwCar() {
        setBrand("Bmw");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--go-----");
    }
}
//------------------------------------------------audi
class AudiCar extends Car {
    public AudiCar() {
        setBrand("Audi");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--go-----");
    }
}
//====================================================== factory
class Driver {
    public static Car createCar(String carName) {
        Car car = null;
        if (carName.equalsIgnoreCase("benz")) {
            car = new BenzCar();
        } else if (carName.equalsIgnoreCase("bmw")) {
            car = new BmwCar();
        } else if (carName.equalsIgnoreCase("audi")) {
            car = new AudiCar();
        }
        return car;
    }
}
2. "Factory Method"
package torv.abc;
public class HelloMain {
    public static void main(String[] args) {
        Driver driver = new BmwDriver();
        driver.createCar().drive();
    }
}
//====================================================== product car
abstract class Car {
    private String brand;
    public abstract void drive();
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brandName) {
        brand = brandName;
    }
}
//------------------------------------------------benz
class BenzCar extends Car {
    public BenzCar() {
        setBrand("Benz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand()+"--go-----");
    }
}
//------------------------------------------------bmw
class BmwCar extends Car {
    public BmwCar() {
        setBrand("Bmw");
    }
    @Override
    public void drive() {
        System.out.println(getBrand()+"--go-----");
    }
}
//------------------------------------------------audi
class AudiCar extends Car {
    public AudiCar() {
        setBrand("Audi");
    }
    @Override
    public void drive() {
        System.out.println(getBrand()+"--go-----");
    }
}
//====================================================== factory
abstract class Driver {
    public abstract Car createCar();
}
class BenzDriver extends Driver{
    @Override
    public Car createCar() {
        return new BenzCar();
    }
}
class BmwDriver extends Driver{
    @Override
    public Car createCar() {
        return new BmwCar();
    }
}
class AudiDriver extends Driver{
    @Override
    public Car createCar() {
        return new AudiCar();
    }
}
3. "Abstract Factory"
package torv.abc;
public class HelloMain {
    public static void main(String[] args) {
        Driver driver = new SportDriver();
        driver.createAudiCar().drive();
    }
}
//====================================================== product car
abstract class Car {
    private String brand;
    private String kind;
    public abstract void drive();
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brandName) {
        brand = brandName;
    }
    public String getKind() {
        return kind;
    }
    public void setKind(String kindName) {
        kind = kindName;
    }
}
//------------------------------------------------benz
abstract class BenzCar extends Car {
    public BenzCar() {
        setBrand("Benz");
    }
}
class BenzSportCar extends BenzCar {
    public BenzSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class BenzBizCar extends BenzCar {
    public BenzBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//------------------------------------------------bmw
abstract class BmwCar extends Car {
    public BmwCar() {
        setBrand("Bmw");
    }
}
class BmwSportCar extends BmwCar {
    public BmwSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class BmwBizCar extends BmwCar {
    public BmwBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//------------------------------------------------audi
abstract class AudiCar extends Car {
    public AudiCar() {
        setBrand("Audi");
    }
}
class AudiSportCar extends AudiCar {
    public AudiSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class AudiBizCar extends AudiCar {
    public AudiBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//====================================================== factory
abstract class Driver {
    public abstract Car createBenzCar();
    public abstract Car createBmwCar();
    public abstract Car createAudiCar();
}
class SportDriver extends Driver {
    @Override
    public Car createBenzCar() {
        return new BenzSportCar();
    }
    @Override
    public Car createBmwCar() {
        return new BmwSportCar();
    }
    @Override
    public Car createAudiCar() {
        return new AudiSportCar();
    }
}
class BizDriver extends Driver {
    @Override
    public Car createBenzCar() {
        return new BenzBizCar();
    }
    @Override
    public Car createBmwCar() {
        return new BmwBizCar();
    }
    @Override
    public Car createAudiCar() {
        return new AudiBizCar();
    }
}
3. "Simple Factory" + Reflect
package torv.abc;
public class HelloMain {
    public static void main(String[] args) {
        try {
            Driver.createCar("torv.abc.BenzSportCar").drive();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//====================================================== product car
abstract class Car {
    private String brand;
    private String kind;
    public abstract void drive();
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brandName) {
        brand = brandName;
    }
    public String getKind() {
        return kind;
    }
    public void setKind(String kindName) {
        kind = kindName;
    }
}
//------------------------------------------------benz
abstract class BenzCar extends Car {
    public BenzCar() {
        setBrand("Benz");
    }
}
class BenzSportCar extends BenzCar {
    public BenzSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class BenzBizCar extends BenzCar {
    public BenzBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//------------------------------------------------bmw
abstract class BmwCar extends Car {
    public BmwCar() {
        setBrand("Bmw");
    }
}
class BmwSportCar extends BmwCar {
    public BmwSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class BmwBizCar extends BmwCar {
    public BmwBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//------------------------------------------------audi
abstract class AudiCar extends Car {
    public AudiCar() {
        setBrand("Audi");
    }
}
class AudiSportCar extends AudiCar {
    public AudiSportCar() {
        setKind("Sport");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
class AudiBizCar extends AudiCar {
    public AudiBizCar() {
        setKind("Biz");
    }
    @Override
    public void drive() {
        System.out.println(getBrand() + "--" + getKind() + "--go-------");
    }
}
//====================================================== factory
abstract class Driver {
    public static Car createCar(String name) throws Exception{
        return (Car) Class.forName(name).newInstance();
    }
}
"Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect"的更多相关文章
- Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】
		I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ... 
- 设计模式之美:Abstract Factory(抽象工厂)
		索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ... 
- simple factory, factory method, abstract factory
		simple factory good:1 devide implementation and initialization2 use config file can make system more ... 
- Design Pattern ——Factory Method&Abstract Factory
		今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ... 
- C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder
		part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ... 
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
		在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ... 
- spring3+structs2整合hibernate4时报org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void sy.dao.impl.UserDaoImpl.setSessionFactory(org.hibernate.SessionFactory);
		今天在spring3+structs2整合hibernate4时报如下错误,一直找不到原因: org.springframework.beans.factory.BeanCreationExcepti ... 
- 简单工厂,Factory Method(工厂方法)和Abstract Factory(抽象工厂)模式
		对于简单工厂来说,它的工厂只能是这个样子的 public class SimplyFactory { /** * 静态工厂方法 */ public static Prouct factory(Str ... 
- 面向对象设计——抽象工厂(Abstract Factory)模式
		定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ... 
随机推荐
- 源代码管理git的使用
			Git ----本地仓库---- 1.新建一个“本地仓库” git init 2.配置仓库 ①告诉git你是谁 git config user.name syl ②告诉git怎么联系你 git con ... 
- iTOP4418开发板7寸屏幕Android系统下横竖屏设置
			Android系统屏幕旋转设置 平台: iTOP4418开发板+7寸屏幕 1. Androd4.4源码可以编译成手机模式和平板模式,讯为iTop4418 开发平台的Android系统默认编译为平板模式 ... 
- C# GDI+ 画坐标(x,y)
			private void button1_Click(object sender, EventArgs e) { Graphics g = this.CreateGraphics(); g.Clear ... 
- .less css 使用 LESS 简化层叠样式表(CSS)的编写(另外一种css框架 sass)
			使用 LESS 简化层叠样式表(CSS)的编写 https://less.bootcss.com/ Sass完全兼容所有版本的CSS https://gojs.net/latest/samples/f ... 
- 小b重排字符串
			2485 小b重排字符串 2 秒 262,144 KB 5 分 1 级题 小b有一个字符串S,现在她希望重排列S,使得S中相邻字符不同. 请你判断小b是否可能成功. 样例解释:将"aab ... 
- Ubuntu-11.10中 vim和Gedit打开html文件中文乱码问题
			解决vim中文乱码方法: 打开/etc/vim/vimrc 添加代码: set fileencodings=utf-8,gb2312,gbk,gb18030 set t ... 
- 关于idea的目录结构如何变成树状,也就是横向变纵向
			横向 竖向 方法: 
- bootstrap不兼容ie8如何解决
			说起bootstrap大家一定都不陌生,可以说是目前最受欢迎的前端框架,简洁.直观.强悍.移动设备优先的前端开发框架,让web开发更迅速.简单. 但是在实际运用中也会遇到各种各样的问题,比如最近项目中 ... 
- double salary = wage = 9999.99错误
			在看书时,有这么一句表达式 double salary = wage = 9999.99; 在Linux中编译时,不能通过,提示是 error: 'wage' was not declared in ... 
- JavaScript:获取上传图片的base64
			文章来源:http://www.cnblogs.com/hello-tl/p/7661535.html 1.HTML代码 <!DOCTYPE html> <html lang=&qu ... 
