- 浏览: 212820 次
- 性别:
- 来自: 北京
文章分类
一、工厂模式
1.简单工厂模式
也叫静态工厂模式,一般是产品的继承类或是接口的实现,如司机开多个车子的例子。
//接口
public Interface Car{
public void driver();
}
//定义接口的实现类
public class QQCar implements Car{
public void driver(){
sysout("QQ driver");
}
}
public class BaoMaCar{
public void driver(){
sysout("BaoMa driver");
}
}
//定义工厂类
public class Driver{
public static final String QQ_CAR = "QQCar";
public static final String BAOMA_CAR="BaoMaCar";
public static Car productCar(String name){
if(name.equalsIgnoreCase("QQCar"){
return new QQCar();
}
if(name.equalsIgnoreCase("BaoMaCar"){
return new BaoMaCar();
}
}
}
//调用工厂创建所需对象
public static void main(String[] args){
Car qqCar = Driver.productCar(Driver.QQ_CAR);
qqCar.driver();
}
总结:简单工厂模式就是达到老板告诉司机我坐QQ车还是做其他车,其余的都交给司机去做。main方法调用出就相当于是老板下达命令。
优点:工厂类需要返回抽象的产品类型即Car。
该模式避免了直接创建产品对象的责任。而仅仅是消费该产品就可以了。
缺点:当添加了一个新的车时,虽然新的调用处置需要告诉司机开心添加的车就可以了,但是工厂类需要添加对应开新车的业务逻辑判断。这样就违背了开闭原则。
新添加车时工厂类是被动的。这样的工厂类被称为全能类。所有车都由一个司机管理会把司机类坏的。
2.工厂方法模式
//注:渴望某个方法被子类实现那么父类的这个方法就不能定义成static和final的。
工厂方法模式去掉了简单工厂模式的static,这样使得它可以被子类继承,这样父工厂的压力就可以由子工厂进行分担了。
组成部分:
a.抽象工厂,子工厂必须继承或是实现父类。与应用程序无关。
b.子工厂,它包含与具体业务逻辑相关的代码。有应用程序调用以创建具体的产品。
c.抽象产品
d.具体产品角色
例子:
//抽象产品和具体产品如上
//抽象工厂
public interface Driver{
public Car driverCar();
}
//抽象工厂的子类,一个子类管理一辆车
public class QQDriver implements Driver{
public Car driverCar(){
return new QQCar();
}
}
//抽象工厂的子类,一个子类管理一辆车
public class BaoMaDriver implements Driver{
public Car driverCar() {
return new BaoMaCar();
}
}
//爆发户来了,即在main方法中调用。
public static void main(String[] args){
Car qqCar = new QQDriver().driver();
qqCar.driver();
}
优点:这样当添加新的汽车时就不需要修改以前的代码,而是直接安装抽象工厂和抽象产品约定的合同来生成就可以被客户端调用了.符合开闭原则。
相当于给原来的司机分配了几个属下去管理车。
缺点:当产品多时会出现非常多与之对应的实现工厂。
总结:可以将简单工厂模式与工厂方法模式结合使用。让一个子工厂管理多个产品。
当客户不需要知道对象的创建过程,或根本不需要知道调用哪个对象。或对象存在变动的可能使用工厂方法模式。
思考:
简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,
新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽
象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品
对象创建条件的改变必然会引起工厂角色的修改。
面对这种情况,Java 的反射机制与配置文件的巧妙结合突破了限制——这在Spring 中
完美的体现了出来。
3.抽象工厂模式
产品家族:位于不同产品等级结构中,功能相关联的产品组成的家族。
QQ车:qq商务车、qq运动车
BaoMa车:BaoMa商务车、BaoMa运动车
则qq运动车和BaoMa运动车就算是运动车家族。
组成:
a.抽象工厂
b.具体工厂
c.抽象产品
d.具体产品
实例
//抽象工厂
public Interface AbstractFactory{
public ProductA productA();
public ProductB productB();
}
//抽象工厂子类生产2代家族
public class Product2Factory implements AbstractFactory{
public ProductA productA(){
return new ProductA2();
}
public ProductB productB(){
return new ProductB2();
}
}
//抽象工厂子类生产1代家族
public class Product1Factory implements AbstractFactory{
public ProductA productA(){
return new ProductA1();
}
public ProductB productB(){
return new ProductB1();
}
}
调用处
public static void main(String[] args){
ProductA productA1 = Product1Factory.productA();
//执行productA1的方法
}
//使用工厂类是为了提高解耦,防止出现骨牌效应
二、单例模式
1.饿汉式单利模式
public class SingleTone{
private SingleTone instance = new SingleTone();//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static SingleTone getInstance(){
return instance;
}
}
2.懒汉式单利模式
public class SingleTone{
private SingleTone instance = null;//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static synchronized SingleTone getInstance(){
if(instance == null){
instance = new SingleTone();
}
return instance;
}
}
上面的这种模式效率比较低,可以采用双检索的方式。
public class Singleton{
private static Singleton single; //声明静态的单例对象的变量
private Singleton(){} //私有构造方法
public static Singleton getSingle(){ //外部通过此方法可以获取对象
if(single == null){
synchronized (Singleton.class) { //保证了同一时间只能只能有一个对象访问此同步块
if(single == null){
single = new Singleton();
}
}
}
return single; //返回创建好的对象
}
}
注:如果是J2EE服务器是多servlet引擎或是分布式的环境中就要注意单例模式的使用
让单例可以串行话
public final class Singleton implements Serializable{
private Singleton () { }
private static final Singleton INSTANCE = new Singleton ();
public static Singleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
}
1.简单工厂模式
也叫静态工厂模式,一般是产品的继承类或是接口的实现,如司机开多个车子的例子。
//接口
public Interface Car{
public void driver();
}
//定义接口的实现类
public class QQCar implements Car{
public void driver(){
sysout("QQ driver");
}
}
public class BaoMaCar{
public void driver(){
sysout("BaoMa driver");
}
}
//定义工厂类
public class Driver{
public static final String QQ_CAR = "QQCar";
public static final String BAOMA_CAR="BaoMaCar";
public static Car productCar(String name){
if(name.equalsIgnoreCase("QQCar"){
return new QQCar();
}
if(name.equalsIgnoreCase("BaoMaCar"){
return new BaoMaCar();
}
}
}
//调用工厂创建所需对象
public static void main(String[] args){
Car qqCar = Driver.productCar(Driver.QQ_CAR);
qqCar.driver();
}
总结:简单工厂模式就是达到老板告诉司机我坐QQ车还是做其他车,其余的都交给司机去做。main方法调用出就相当于是老板下达命令。
优点:工厂类需要返回抽象的产品类型即Car。
该模式避免了直接创建产品对象的责任。而仅仅是消费该产品就可以了。
缺点:当添加了一个新的车时,虽然新的调用处置需要告诉司机开心添加的车就可以了,但是工厂类需要添加对应开新车的业务逻辑判断。这样就违背了开闭原则。
新添加车时工厂类是被动的。这样的工厂类被称为全能类。所有车都由一个司机管理会把司机类坏的。
2.工厂方法模式
//注:渴望某个方法被子类实现那么父类的这个方法就不能定义成static和final的。
工厂方法模式去掉了简单工厂模式的static,这样使得它可以被子类继承,这样父工厂的压力就可以由子工厂进行分担了。
组成部分:
a.抽象工厂,子工厂必须继承或是实现父类。与应用程序无关。
b.子工厂,它包含与具体业务逻辑相关的代码。有应用程序调用以创建具体的产品。
c.抽象产品
d.具体产品角色
例子:
//抽象产品和具体产品如上
//抽象工厂
public interface Driver{
public Car driverCar();
}
//抽象工厂的子类,一个子类管理一辆车
public class QQDriver implements Driver{
public Car driverCar(){
return new QQCar();
}
}
//抽象工厂的子类,一个子类管理一辆车
public class BaoMaDriver implements Driver{
public Car driverCar() {
return new BaoMaCar();
}
}
//爆发户来了,即在main方法中调用。
public static void main(String[] args){
Car qqCar = new QQDriver().driver();
qqCar.driver();
}
优点:这样当添加新的汽车时就不需要修改以前的代码,而是直接安装抽象工厂和抽象产品约定的合同来生成就可以被客户端调用了.符合开闭原则。
相当于给原来的司机分配了几个属下去管理车。
缺点:当产品多时会出现非常多与之对应的实现工厂。
总结:可以将简单工厂模式与工厂方法模式结合使用。让一个子工厂管理多个产品。
当客户不需要知道对象的创建过程,或根本不需要知道调用哪个对象。或对象存在变动的可能使用工厂方法模式。
思考:
简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,
新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽
象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品
对象创建条件的改变必然会引起工厂角色的修改。
面对这种情况,Java 的反射机制与配置文件的巧妙结合突破了限制——这在Spring 中
完美的体现了出来。
3.抽象工厂模式
产品家族:位于不同产品等级结构中,功能相关联的产品组成的家族。
QQ车:qq商务车、qq运动车
BaoMa车:BaoMa商务车、BaoMa运动车
则qq运动车和BaoMa运动车就算是运动车家族。
组成:
a.抽象工厂
b.具体工厂
c.抽象产品
d.具体产品
实例
//抽象工厂
public Interface AbstractFactory{
public ProductA productA();
public ProductB productB();
}
//抽象工厂子类生产2代家族
public class Product2Factory implements AbstractFactory{
public ProductA productA(){
return new ProductA2();
}
public ProductB productB(){
return new ProductB2();
}
}
//抽象工厂子类生产1代家族
public class Product1Factory implements AbstractFactory{
public ProductA productA(){
return new ProductA1();
}
public ProductB productB(){
return new ProductB1();
}
}
调用处
public static void main(String[] args){
ProductA productA1 = Product1Factory.productA();
//执行productA1的方法
}
//使用工厂类是为了提高解耦,防止出现骨牌效应
二、单例模式
1.饿汉式单利模式
public class SingleTone{
private SingleTone instance = new SingleTone();//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static SingleTone getInstance(){
return instance;
}
}
2.懒汉式单利模式
public class SingleTone{
private SingleTone instance = null;//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static synchronized SingleTone getInstance(){
if(instance == null){
instance = new SingleTone();
}
return instance;
}
}
上面的这种模式效率比较低,可以采用双检索的方式。
public class Singleton{
private static Singleton single; //声明静态的单例对象的变量
private Singleton(){} //私有构造方法
public static Singleton getSingle(){ //外部通过此方法可以获取对象
if(single == null){
synchronized (Singleton.class) { //保证了同一时间只能只能有一个对象访问此同步块
if(single == null){
single = new Singleton();
}
}
}
return single; //返回创建好的对象
}
}
注:如果是J2EE服务器是多servlet引擎或是分布式的环境中就要注意单例模式的使用
让单例可以串行话
public final class Singleton implements Serializable{
private Singleton () { }
private static final Singleton INSTANCE = new Singleton ();
public static Singleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
}
发表评论
-
多种单例模式的分析
2012-03-28 18:06 0blog.csdn.net/derpvailzhangfan/ ... -
JDK中的设计模式
2012-03-14 22:56 01.Abstract Factory •java.util.C ... -
简单工厂模式使用心得(使用场景)
2012-02-23 18:24 11494在实际项目中,简单工厂模式是我们使用的最多的设计模式之一,简单 ... -
AbstractList中Iterator模式的妙用
2012-01-13 11:51 952AbstractList中为了实现顺序访问AbstractLi ... -
适合使用命令模式的情景
2012-01-13 11:31 897情景1.当借个类都拥有 ... -
Iterator模式
2012-01-13 10:57 863我个人常叫它游标模式,该模式的主要目的就是,顺序访问集合中的各 ... -
使用工厂设计模式的场景
2012-01-12 15:43 2749创建类对象虽然可以使用new(底层也是通过反射创建对象的),但 ... -
JDK中使用的设计模式
2012-01-13 10:04 14221.抽象工厂模式 实 ... -
JDK中使用的设计模式代码实例
2012-01-05 17:38 0http://stackoverflow.com/questi ... -
享元模式
2011-12-23 10:22 1012通常情况下,我们会需 ... -
策略模式
2011-12-22 17:07 848所谓策略模式就是定义了多种算法,而让不同算法之间的切换不会影响 ... -
合成设计模式
2011-12-22 16:28 956如果要将对象组织到树中,使用树来表示对象之间的关系,请考虑使用 ... -
责任链模式
2011-12-20 18:35 812此文转正于http://wenku.baidu.com/vie ... -
桥梁设计模式
2011-12-19 18:19 817如果有很多对象要处理,而又有很多操作要做。这时可以考虑使用桥梁 ... -
多线程设计模式(Thread-Specific storage)
2011-12-12 15:29 5831引用自http://www.riabook.cn/doc/de ... -
代理模式
2011-11-30 15:26 911代理模式实际上是对对象的一种代理,以控制对象的访问。 有些情况 ... -
观察者模式
2011-11-16 14:48 1380声明转载的,简单易懂,呵呵 观察者模式的构造 l 抽 ... -
命令模式
2011-11-16 14:11 1231今天想学学命令模式,看见了一个文章讲的就是命令模式,感觉实例比 ... -
建造模式
2011-11-14 12:03 893建造模式是将负责对象 ... -
设计模式之适配器模式
2011-11-09 18:24 943适配器模式:主要是为了解决,老的对象在新的环境中不兼容的现象。 ...
相关推荐
设计模式--工厂模式java例子
设计模式中工厂方法模式的一个例子,希望对大家有用~~~~~~
本例子是用C#写的一个关于应用简单工厂设计模式的小例子,一个简单计算器的控制台应用程序。
5. Qt工厂模式例子 6. 简单工厂模式 部分源码实例: // 奔驰工厂 class BenzFactory : public AFactory { public: ICar* CreateCar() { return new BenzCar(); } }; // 宝马工厂 class BmwFactory : public A...
java工厂设计模式讲解+例子,三种工厂模式的讲解,简单工厂、工厂方法、抽象工厂
C++设计模式例程,工厂模式例子,环境是VS2019打开即可运行 工厂模式也是平时我们编程用的比较多的一种行为设计模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体...
设计模式中抽象工厂模式的一个例子,希望对大家有用~~~~~~
工厂模式的具体例子,很好的东西,想学习设计模式的可以下载了看看
NET设计模式--工厂方法例子源码
C#抽象工厂设计模式的简单实现,能够简单的切换数据库,本例以ACCESS和SQL数据库为例...access数据库的连接字符串是绝对路径,用时需要改
设计模式中的简单工厂模式的一个小例子,希望对大家有用~~~~~~~~~~
三种设计模式:简单工厂/工厂方法/抽象工厂,通过一个教研室购买电脑的例子来进行讲述区别和联系,可以参考我的博客进行阅读。谢谢你的指正。
java,工厂设计模式,学习,讲解,各种讲解的例子,案例,集合
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
java工厂模式一个简单的工厂模式例子工厂模式简单代码案例,仅供参考。java工厂模式一个简单的工厂模式例子工厂模式简单代码案例,仅供参考。java工厂模式一个简单的工厂模式例子工厂模式简单代码案例,仅供参考。...
学习工厂模式-设计模式的一个很好的例子,尤其对初学者而言!
以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...
这是设计模式的工厂模式的改善代码版本,用了反射机制,是用的菜鸟教程网站零散例子,在本地实际跑代码。自己给自己做个复习
包含两个zip文件夹calculatorConsole.zip和calculatorConsole2.zip,...还增加了异常处理,以及运用了“简单工厂设计模式”,代码的灵活性、扩展性、复用性、维护性都很好,可以很方便的移植到需要GUI的计算器实现中。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...