- 浏览: 251558 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zoukaiwolai:
...
Java 16进制字符串与2进制字符串相互转换 -
sooxin:
j2ee的事务对连接有自己的管理机制,包括建立和关闭。没进j2 ...
c3p0 spring 包没进事务管理,连接池就不能释放 -
sooxin:
mina 采用一种NIO通信,底层的连接机制没有具体研究过,但 ...
转 Mina框架在项目中的使用 -
tywo45:
写得很好,希望博主把格式调一下!
Tomcat性能参数设置介绍 -
freecode:
采用了cp30,项目中出现很多未关闭的连接,一直在找原因.
c3p0 spring 包没进事务管理,连接池就不能释放
今天我去市场,要决定是买水果等产品,还是选择种水果的产品。具体怎么操作自己选择。来到市场,我发现主要有一些水果:苹果(Apple),葡萄(Grape)和鸭梨(Pear)。到底买什么好呢?我一阵思量。俗话说:“饭后一只烟,赛过活神仙。饭后吃苹果,西施见我躲。”为了老婆的漂亮,我决定买苹果。
下面开始Factory模式研究,当然是用我上面举的例子来说明。
Simple Factory模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
Factory Method模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。
Abstract Factory模式
提供一个共同的接口来创建相互关联的多个对象。
一、Simple Factory模式:
1、 在这里,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、 苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、 葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、 鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、定义买水果(BuyFruit)这一过程类:
public class BuyFruit {
/**
简单工厂方法
*/
public static Fruit buyFruit(String which){
if (which.equalsIgnoreCase("apple")) { //如果是苹果,则返回苹果实例
return new Apple();
}
else if (which.equalsIgnoreCase("pear")){ //如果是鸭梨,则返回鸭梨实例
return new Strawberry();
}
else if (which.equalsIgnoreCase("grape")) { //如果是葡萄,则返回葡萄实例
return new Grape();
}
else{
return null;
}
}
}
6、 编写测试类:
public class FruitTest {
public static void main(String args[]){
BuyFruit buy = new BuyFruit(); //开始买水果这个过程
buy.buyFruit("apple").enableEat(); //调用苹果的enableEat()方法
}
}
7、 说明:
A:我要购买苹果,只需向工厂角色(BuyFruit)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。
B:但是对于工厂角色(BuyFruit)来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。
C:因此Simple Factory模式的开放性比较差。
有什么办法可以解决这个问题吗?那就需要Factory Method模式来为我们服务了。
二、Factory Method模式:
1、同样,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、在这里我们将买水果(BuyFruit)定义为接口类:
public interface BuyFruit{
/**
工厂方法
*/
public Fruit buyFruit(); //定义买水果这一过程
}
6、买苹果是(BuyApple)对买水果(BuyFruit)这个接口的实现
public class BuyApple implements BuyFruit{
public Fruit buyFruit(){
return new Apple(); //返回苹果实例
}
}
7、买鸭梨是(BuyPear)对买水果(BuyFruit)这个接口的实现
public class BuyPear implements BuyFruit{
public Fruit BuyPear (){
return new Pear(); //返回鸭梨实例
}
}
8、买葡萄是(BuyGrape)对买水果(BuyFruit)这个接口的实现
public class BuyGrape implements BuyFruit{
public Fruit BuyGrape (){
return new Grape (); //返回葡萄实例
}
}
9、编写测试类:
public class FruitTest {
public static void main(String args[]){
BuyApple buy = new BuyApple(); //开始买水果这个过程
buy.buyFruit().enableEat(); //调用苹果的enableEat()方法
}
}
10、说明:
A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。
C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的水果类而言,这个系统完全支持“开-闭”原则。
D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Factory Method模式帮忙了。
三、Abstract Factory模式
1、同样,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、 定义肉(Meat)接口:
public interface Meat {
void feed(); //肉是喂养的
void enableEat(); //肉能吃
}
6、 猪肉(BigMeat)是对肉(Meat)接口的实现:
public class BigMeat implements Meat{
public void feed(){
System.out.println("养猪!");
}
public void enableEat(){
System.out.println("猪肉好吃!");
}
}
7、 牛肉(CowMeat)是对肉(Meat)接口的实现:
public class CowMeat implements Meat {
public void feed(){
System.out.println("养牛!");
}
public void enableEat(){
System.out.println("牛肉好吃!");
}
}
8、 我们可以定义买货人(Buyer)接口:
public interface Buyer {
/**
买水果工厂方法
*/
public Fruit buyFruit(Fruit whichFruit);
/**
买肉的工厂方法
*/
public Meat buyMeat(Meat whichMeat);
}
9、 我(MyBuyer)是对买货人(Buyer)接口的实现:
public class MyBuyer implements Buyer{
/**
买水果工厂方法
*/
public Fruit buyFruit(Fruit whichFruit){
return whichFruit;
}
/**
买肉的工厂方法
*/
public Meat buyMeat(Meat whichMeat){
return whichMeat;
}
}
10、编写测试类:
public class MyBuyerAbstractTest {
public static void main(String args[]){
Fruit apple = new Apple(); //苹果实例
Meat big = new BigMeat(); //猪肉实例
MyBuyer my = new MyBuyer(); //我是买者的实例
my.buyFruit(apple).enableEat(); //我买苹果
my.buyMeat(big).enableEat(); //我买猪肉
}
}
11、说明:
A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
B:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
下面开始Factory模式研究,当然是用我上面举的例子来说明。
Simple Factory模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
Factory Method模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。
Abstract Factory模式
提供一个共同的接口来创建相互关联的多个对象。
一、Simple Factory模式:
1、 在这里,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、 苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、 葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、 鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、定义买水果(BuyFruit)这一过程类:
public class BuyFruit {
/**
简单工厂方法
*/
public static Fruit buyFruit(String which){
if (which.equalsIgnoreCase("apple")) { //如果是苹果,则返回苹果实例
return new Apple();
}
else if (which.equalsIgnoreCase("pear")){ //如果是鸭梨,则返回鸭梨实例
return new Strawberry();
}
else if (which.equalsIgnoreCase("grape")) { //如果是葡萄,则返回葡萄实例
return new Grape();
}
else{
return null;
}
}
}
6、 编写测试类:
public class FruitTest {
public static void main(String args[]){
BuyFruit buy = new BuyFruit(); //开始买水果这个过程
buy.buyFruit("apple").enableEat(); //调用苹果的enableEat()方法
}
}
7、 说明:
A:我要购买苹果,只需向工厂角色(BuyFruit)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。
B:但是对于工厂角色(BuyFruit)来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。
C:因此Simple Factory模式的开放性比较差。
有什么办法可以解决这个问题吗?那就需要Factory Method模式来为我们服务了。
二、Factory Method模式:
1、同样,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、在这里我们将买水果(BuyFruit)定义为接口类:
public interface BuyFruit{
/**
工厂方法
*/
public Fruit buyFruit(); //定义买水果这一过程
}
6、买苹果是(BuyApple)对买水果(BuyFruit)这个接口的实现
public class BuyApple implements BuyFruit{
public Fruit buyFruit(){
return new Apple(); //返回苹果实例
}
}
7、买鸭梨是(BuyPear)对买水果(BuyFruit)这个接口的实现
public class BuyPear implements BuyFruit{
public Fruit BuyPear (){
return new Pear(); //返回鸭梨实例
}
}
8、买葡萄是(BuyGrape)对买水果(BuyFruit)这个接口的实现
public class BuyGrape implements BuyFruit{
public Fruit BuyGrape (){
return new Grape (); //返回葡萄实例
}
}
9、编写测试类:
public class FruitTest {
public static void main(String args[]){
BuyApple buy = new BuyApple(); //开始买水果这个过程
buy.buyFruit().enableEat(); //调用苹果的enableEat()方法
}
}
10、说明:
A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。
C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的水果类而言,这个系统完全支持“开-闭”原则。
D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Factory Method模式帮忙了。
三、Abstract Factory模式
1、同样,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、 定义肉(Meat)接口:
public interface Meat {
void feed(); //肉是喂养的
void enableEat(); //肉能吃
}
6、 猪肉(BigMeat)是对肉(Meat)接口的实现:
public class BigMeat implements Meat{
public void feed(){
System.out.println("养猪!");
}
public void enableEat(){
System.out.println("猪肉好吃!");
}
}
7、 牛肉(CowMeat)是对肉(Meat)接口的实现:
public class CowMeat implements Meat {
public void feed(){
System.out.println("养牛!");
}
public void enableEat(){
System.out.println("牛肉好吃!");
}
}
8、 我们可以定义买货人(Buyer)接口:
public interface Buyer {
/**
买水果工厂方法
*/
public Fruit buyFruit(Fruit whichFruit);
/**
买肉的工厂方法
*/
public Meat buyMeat(Meat whichMeat);
}
9、 我(MyBuyer)是对买货人(Buyer)接口的实现:
public class MyBuyer implements Buyer{
/**
买水果工厂方法
*/
public Fruit buyFruit(Fruit whichFruit){
return whichFruit;
}
/**
买肉的工厂方法
*/
public Meat buyMeat(Meat whichMeat){
return whichMeat;
}
}
10、编写测试类:
public class MyBuyerAbstractTest {
public static void main(String args[]){
Fruit apple = new Apple(); //苹果实例
Meat big = new BigMeat(); //猪肉实例
MyBuyer my = new MyBuyer(); //我是买者的实例
my.buyFruit(apple).enableEat(); //我买苹果
my.buyMeat(big).enableEat(); //我买猪肉
}
}
11、说明:
A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
B:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
发表评论
-
Java中序列化的好处及意义
2019-07-26 15:38 10611、序列化是干什么的? ... -
小学语文课堂教学三维目标的制定和落实-广安齐祥娥
2019-07-06 11:31 15教学目标是教学过程中重要的一部分,它是教学的出发点 也是教学 ... -
深入研究Servlet线程安全性问题
2019-05-11 12:27 329Servlet(Server Applet)是 ... -
Java线程池
2019-05-11 12:25 421介绍new Thread的弊端及Java四种线程池的使用, ... -
Spring 事务的配置和使用详解(包括手动对事务的控制部分)
2019-04-05 15:28 752事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度 ... -
java 数据越界奇异问题
2016-05-19 00:31 567public class yy { public stat ... -
mysql 要 innodb引擎才支持事务
2015-04-03 21:53 769如题 ---------- -
Centos系统的单网卡绑定双ip的设置
2014-07-24 16:22 1103单个网卡,一个公网,一个内网ip的设置,可以参考下面的例子。 ... -
centeros java 显示乱码问题
2014-05-31 00:44 604vi /etc/sysconfig/i18n LANG=&q ... -
SmartFoxServer项目完成总结
2013-09-16 17:41 1119总体来说,如果是想做一个比较简单的虚拟现实服务,拿sfs来做还 ... -
centos6.2安装jdk1.6.0_30
2012-03-25 03:03 30811,卸载原来的openJDK:yum -y remove ja ... -
C3P0连接池详细配置
2011-10-09 17:21 823<c3p0-config> <defaul ... -
synchronized
2011-09-27 17:13 810synchronized 关键字,代表 ... -
c3p0 spring 包没进事务管理,连接池就不能释放
2011-05-25 16:20 3335c3p0 spring 包没进事务管理,连接池就不能释放 -
com.mysql.jdbc.CommunicationsException
2011-05-11 11:10 1018异常代码** BEGIN NESTED EXCEPTION * ... -
Eclipse 快捷键
2010-10-29 12:11 757Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl ... -
静态方法、单例模式区别
2010-10-28 21:54 3561关于这个问题,下面是一些同仁的观点:观点一:(单例)单例模 ... -
接口与抽象类有什么区别
2010-10-28 18:45 923abstract class和interface是Ja ... -
Java接口和Java抽象类 转
2010-10-25 17:24 839在没有好好地研习面向 ... -
as里回调函数
2010-10-16 14:44 1190/*** 回调函数 示例* 2010-8-26 9:52* @ ...
相关推荐
设计模式之Factory
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
c++设计模式之factory设计模式
java设计模式之Factory[文].pdf
java设计模式之Factory借鉴.pdf
java设计模式之Factory参照.pdf
java设计模式之Factory文.pdf
设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
张建中 c#面向对象设计模式之abstract method视频教程
设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...
设计模式-Singleton与Factory
对设计模式—Abstract Factory模式的认识
Java设计模式之工厂模式(Factory).doc
各个设计模式的介绍,非常不错 Java与设计模式 设计模式之Factory -工厂模式设计模式之FACTORY METHOD -工厂模式設計模式之Builder -建造模式
1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一...
在前一节,我们介绍了Strategy模式,并使用此模式实现了一个根据角色的职业来分配技能的范例(实际也就是动态地为类分配方法)。...本文将讨论如何使用GOF的Abstract Factory抽象工厂来实现这样的角色外形设计。
创建型模式(Creational Pattern) 是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建型模式描述了怎样构造和封装这些动态的决定...
C#设计模式之----AbstractFactory (附原码)