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"的更多相关文章

  1. 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 ...

  2. 设计模式之美:Abstract Factory(抽象工厂)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...

  3. simple factory, factory method, abstract factory

    simple factory good:1 devide implementation and initialization2 use config file can make system more ...

  4. Design Pattern ——Factory Method&Abstract Factory

    今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ...

  5. C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder

    part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...

  6. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  7. 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 ...

  8. 简单工厂,Factory Method(工厂方法)和Abstract Factory(抽象工厂)模式

    对于简单工厂来说,它的工厂只能是这个样子的 public class SimplyFactory {  /** * 静态工厂方法 */ public static Prouct factory(Str ...

  9. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

随机推荐

  1. idea 常用操作

    1.创建的maven项目,java文件不提示错误:有main方法但右击却找不到run选项的问题 1)首先要配置SDK--就是配置JDK 2)然后要按照提示信息导入某些maven相关的东西,就这个Eve ...

  2. 花括号的使用 printf %${width}s , 否则会 去找 $widths

    花括号的使用  printf %${width}s , 否则会 去找  $widths 1 #! /usr/bin/perl   2 use strict;  3 use warnings;  4   ...

  3. UIScrollView的contentSize、contentOffset和contentInset属性

    IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属性,同时,U ...

  4. Linux从入门到适应(二):更换清华源

    1 进入到/etc/apt文件夹当中,找到sources.list,将其备份.命令:cp -p sources.list sources.list.old 2 采用管理员方式打开sources.lis ...

  5. 笔试算法题(18):常数时间删除节点 & 找到仅出现一次的两个数字

    出题:给定链表的头指针和一个节点指针,要求在O(1)的时间复杂度下删除该节点 分析: 如果需要删除的节点为A,其前序节点为A-,其后续节点为A+,所以删除A之后,需要使得A-的下一个节点就是A+,常规 ...

  6. delphi clipboard

    判断clipboard里的格式: if   CliPBoard.HasFormat(CF_TEXT)   then        EdIT1.Text   :=   CliPBoard.AsText ...

  7. Linux命令整理(2018/9/9-2018/9/15)

    根据本周的Linux学习进度,整理了部分Linux知识及常用命令,待完善…… 1.显示默认启动方式(默认启动目标): systemctl get-default 2.设置默认启动方式(默认启动目标): ...

  8. python3.x Day4 模块!!

    json and pickle模块 用途是为了持久化信息,这种持久化方式可以和其他程序语言兼容,一般都支持json,json只能持久化数据,pickle是python特有的方式,可以持久化所有信息和数 ...

  9. 爬虫基础spider 之(一) --- 初识爬虫

    爬虫概念 (spider,网络蜘蛛)通过互联网上一个个的网络节点,进行数据的提取.整合以及存储.从而获取我们想要的部分 robots协议 robots协议不是技术层面的协议,只是一个君子协定: 首先在 ...

  10. Oracle创建 表空间 用户 给用户授权命令

    //创建表空间 create tablespace ACHARTSdatafile 'D:\oradata\orcl\ACHARTS01.DBF' size 800mautoextend on nex ...