`

工厂设计模式和单例子的设计模式

阅读更多
一、工厂模式
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;
}
}
分享到:
评论

相关推荐

    设计模式中工厂方法模式的一个例子

    设计模式中工厂方法模式的一个例子,希望对大家有用~~~~~~

    设计模式--工厂模式java例子

    在这些模式中,工厂模式尤为突出,它是一种创建型设计模式,为对象的创建提供了抽象接口,使得代码无需直接实例化具体类,而是通过工厂方法来创建对象。 在Java编程语言中,工厂模式的应用广泛且实用。它主要分为三...

    简单工厂设计模式小例子

    总的来说,这个例子展示了简单工厂设计模式如何在C#中用于创建和使用对象。通过这种方式,我们可以轻松地添加新的运算类型,只需创建一个新的派生类并更新工厂类的逻辑,而无需修改已经使用工厂的客户端代码。这种...

    刘伟设计模式和例子

    总结来说,"刘伟设计模式和例子"是一份宝贵的资源,涵盖了软件设计的核心——设计模式。通过深入学习和理解这些模式,并结合具体的示例,开发者能够提升自己的编程技能,更好地应对各种软件设计问题。无论你是初学者...

    qt工厂模式例子qt简单工程模式源码

    5. Qt工厂模式例子 6. 简单工厂模式 部分源码实例: // 奔驰工厂 class BenzFactory : public AFactory { public: ICar* CreateCar() { return new BenzCar(); } }; // 宝马工厂 class BmwFactory : public A...

    java工厂设计模式讲解+例子

    java工厂设计模式讲解+例子,三种工厂模式的讲解,简单工厂、工厂方法、抽象工厂

    用生动的例子讲述设计模式

    通过以上介绍,我们可以看出这本书不仅覆盖了设计模式的基本概念,还通过生动的例子帮助读者更好地理解和应用这些模式。设计模式作为软件工程领域的重要组成部分,对于提高代码质量和可维护性有着不可忽视的作用。

    C++设计模式例程,工厂模式例子

    C++设计模式例程,工厂模式例子,环境是VS2019打开即可运行 工厂模式也是平时我们编程用的比较多的一种行为设计模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体...

    java 23种设计模式及具体例子

    java 设计模式 java 设计模式是软件工程的基石,它们被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式可以让代码更容易被他人理解、保证代码可靠性、提高代码的重用性。 一、设计模式...

    设计模式(简单工厂,工厂,抽象工厂)简单例子.rar

    本篇文章将深入探讨三种创建型设计模式:简单工厂模式、工厂方法模式和抽象工厂模式,通过生动的比喻以及实际应用的例子,揭示它们各自的特点和应用场景。 首先,我们从简单工厂模式开始。简单工厂模式是一种创建型...

    C#抽象工厂设计模式(小例子源码)

    抽象工厂设计模式是一种创建型设计模式,它提供了一种创建对象族的方式,这些对象属于同一接口但具有不同的实现。在C#中,这种模式经常用于当系统需要根据环境或配置信息来创建一组相关或相互依赖的对象时,而无需...

    设计模式之工厂

    "工厂模式"是其中一种常用的设计模式,它提供了一种创建对象的最佳方式。在这个主题下,我们将深入探讨三种主要的工厂模式:简单工厂、工厂方法和抽象工厂。 1. **简单工厂模式**: 简单工厂模式是最基础的形式,...

    设计模式中抽象工厂模式的一个例子

    抽象工厂模式是设计模式中的一种,属于创建型模式,它提供了一个创建对象的接口,但允许子类决定实例化哪些类。这个模式的关键在于为一组相关或相互依赖的对象提供一个统一的接口,而无需指定他们的具体实现。 抽象...

    工厂模式例子代码

    工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象创建过程中复杂性的问题。在工厂模式中,我们定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样,工厂方法就可以返回一个对象...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    设计模式工厂方法模式PPT学习教案.pptx

    本学习教案旨在讲解设计模式中的工厂方法模式(Factory Method),通过学习本教案,学生将掌握工厂方法模式的定义、结构、实例、分析和应用。 模式动机与定义 在软件设计中,我们经常需要创建对象,但是在什么时候...

    JAVA设计模式的工厂模式文档和代码

    工厂模式是设计模式中的一种,属于创建型模式,它的主要目标是提供一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂模式使代码能够独立于实际的产品类型进行工作。 工厂模式的核心思想是通过一个共同的...

    设计模式_工厂模式

    设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在这些模式中,工厂模式是一种创建型模式,它提供了一种封装对象创建过程的方法,使得客户端代码无需直接实例化对象,而是通过...

    设计模式例子和PPT

    在这个“设计模式例子和PPT”压缩包中,包含的内容主要是关于设计模式的基本原则、UML类图以及一些实际的应用示例。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都有其特定的目标和适用场景...

    Head First 设计模式 +Java设计模式(第2版)

    通过阅读并实践书中的例子,你可以逐渐掌握如何在实际项目中灵活运用设计模式,从而提高代码质量和团队协作效率。无论是初学者还是经验丰富的开发者,都应该把设计模式作为持续学习和改进的重要部分。

Global site tag (gtag.js) - Google Analytics