"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)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
随机推荐
- php自动加载函数
含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...
- idea 一些设置
idea 中编码格式:VM options 中输入:-Dfile.Encoding=UTF-8 添加tomcat 当+号中没有tomcat时,先看有没有tomcat插件,没有则进行添加,然后 ...
- 两个自动配置IPv4
今天一早过来发现网络连接不上了,ipconfig一下后,发现ip并不是我固定配置的ip地址,而是变成了一个完全不一样的ip,点击本地连接,点击详细信息,发现有两个自动配置IPv4,原因可能是ip地址冲 ...
- 6-Java-C(移动距离)
题目描述: X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 ...
- C#反射的使用
1.先定义个类,编译成dll,用于调用 nameSpace Test{ public class Class1 { private string _name; private int _age; pu ...
- IIS HTTP 错误 401.3的解决办法
目标网站添加新用户Everyone,选上需要的Everyone用户权限
- 第2节 mapreduce深入学习:8、手机流量汇总求和
第2节 mapreduce深入学习:8.手机流量汇总求和 例子:MapReduce综合练习之上网流量统计. 数据格式参见资料夹 需求一:统计求和 统计每个手机号的上行流量总和,下行流量总和,上行总流量 ...
- js读取文本内容,支持csv.txt
js读取文本内容,支持csv.txt <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- 级数求和(C++)
题目描述 已知:Sn=1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1≤K≤15),要求计算出一个最小的n:使得Sn>K. 输入 ...
- 空循环导致CPU使用率很高
业务背景 业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集binlog消息到kafka里,然后我去消费,实现增量同 ...